千辛万苦的用char型过了……
下面那个我觉得也对……然而不过
代码在这:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
int n,c;
int a[101];
int op[101];
int cl[101];
char ss[300][110];
int cmp(const void *p,const void *q)
{
return strcmp((char *)p,(char *)q);
}
void do1()
{
for(int i=1;i<=100;++i)
a[i]^=1;
}
void do2()
{
for(int i=2;i<=n;i+=2)
a[i]^=1;
}
void do3()
{
for(int i=1;i<=n;i+=2)
a[i]^=1;
}
void do4()
{
for(int i=1;i<=n;i+=3)
a[i]^=1;
}
int cnt=0;
int check()
{
for(int i=1;i<=n;++i){
if(op[i]==1&&a[i]==0) return 1;
if(cl[i]==1&&a[i]==1) return 1;
}
return 0;
}
void dfs(int x)
{
if(x==c)
{
if(check()==0)
{
for(int i=0; i<n; i++)
ss[cnt][i]=a[i+1]+'0';
ss[cnt][n]='\0';
cnt++;
}
return;
}
for(int i=1;i<=4;++i)
{
switch(i)
{
case 1:
do1();
dfs(x+1);
do1();
break;
case 2:
do2();
dfs(x+1);
do2();
break;
case 3:
do3();
dfs(x+1);
do3();
break;
case 4:
do4();
dfs(x+1);
do4();
break;
}
}
}
int main()
{
scanf("%d%d",&n,&c);
memset(op,0,sizeof(op));
memset(cl,0,sizeof(cl));
for(int i=1;i<=n;++i)
a[i]=1;
int x;
while(scanf("%d",&x)==1&&x!=-1)
op[x]=1;
while(scanf("%d",&x)==1&&x!=-1)
cl[x]=1;
if(c>4)
{
c%=2;
if (c==1)
{
c=3;
}
else
{
c=4;
}
}
dfs(0);
qsort(ss,cnt,sizeof(ss[0]),cmp);
printf("%s",ss[0]);
printf("\n");
int i,j,flag;
for(i=0,j=1;j<cnt;j++)
{
flag=0;
for(int k=0;k<=6;++k)
{
if(ss[i][k]!=ss[j][k]) {flag=1;break;}
}
if(flag){
i=j;
printf("%s",ss[j]);
printf("\n");
}
}
return 0;
}
/*int li[9][7]={
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,//按1
0,0,0,1,1,1,0,//按1按4
0,0,1,0,1,0,1,//按3
0,0,1,1,0,1,1,//g按1按4
0,1,0,0,1,0,0,//按4
0,1,0,1,0,1,0,//按2
0,1,1,0,0,0,1,//按2按4
0,1,1,1,1,1,1,//不按
};//常量表
int minn[9]={0,1,2,1,1,2,1,2,0};//对应常量表8个状态最少摁的次数
int s[110];
int main()
{
int n,c,x,y;
int q1=0,q2=0;
scanf("%d%d",&n,&c);
memset(s,-1,sizeof(s));
scanf("%d",&x);
while(x!=-1) {s[x]=1;q1++;scanf("%d",&x);}
scanf("%d",&y);
while(y!=-1) {s[y]=0;q2++;scanf("%d",&y);}
bool f1;
for(int i=1;i<9;++i)
{
f1=true;
for(int j=1;j<=n;++j)
{
if(s[j]==-1) continue;
int tmp=j%6;
if(tmp==0) tmp=6;
if(s[j]!=li[i][tmp]) {f1=false;break;}
}
if(f1==true&&c>=minn[i])
{
for(int j=1;j<=n;++j)
{
int tmp=j%6;
if(tmp==0) tmp=6;
printf("%d",li[i][tmp]);
}
printf("\n");
}
}
return 0;
}*/
652



被折叠的 条评论
为什么被折叠?



