比较简单的搜索,应该很容易看出来,一次bfs搜出所有结果即可。
#include#include #include using namespace std; char a[20]; int n,m; int goal; int dp[70000],turn[111]; int que[70000]; bool text[70000]; void bfs() { memset(text,0,sizeof(text)); int front=1,end=0; for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) { que[++end]=(turn[i]^turn[j]); text[turn[i]^turn[j]]=1; dp[turn[i]^turn[j]]=1; } while(front<=end) { int tmp=que[front++]; for(int i=1;i<=m;i++) if(!text[turn[i]^tmp]) { text[turn[i]^tmp]=1; dp[turn[i]^tmp]=dp[tmp]+1; que[++end]=(turn[i]^tmp); } } } int cal(int a,int b) { int tmp=(a^b),ret=0; while(tmp) { ret+=(tmp&1); tmp/=2; } return ret; } int main() { // freopen("in.txt","r",stdin); while(scanf("%d %d",&n,&m)!=EOF) { memset(dp,50,sizeof(dp)); scanf("%s",a+1); int sum=0; for(int i=n,tmp=1;i> =1;i--) { sum+=(a[i]-'0')*tmp; tmp*=2; } goal=sum; for(int i=1;i<=m;i++) { scanf("%s",a+1); sum=0; for(int j=n,tmp=1;j>=1;j--) { sum+=tmp*(a[j]-'0'); tmp*=2; } turn[i]=sum; } bfs(); int ans=11111111,id; for(int i=0;i<70000;i++) if(dp[i]<111111111) if(cal(i,goal)=1;i--) printf("%d",s[i]); printf("\n"); } return 0; }