这个题目需要注意的是一定要操作,即初始串及时跟目标串相同,仍然需要操作。
比较简单的搜索,应该很容易看出来,一次bfs搜出所有结果即可。
#include <iostream>
#include <cstdio>
#include <cstring>
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)<ans)
{
ans=cal(i,goal);
id=i;
}
else if(cal(i,goal)==ans)
{
if(dp[i]<dp[id])
{
id=i;
}
}
cout<<dp[id]<<endl;
int s[20],lon=0;
while(id)
{
s[++lon]=id%2;
id/=2;
}
for(int i=lon+1;i<=n;i++)
printf("0");
for(int i=lon;i>=1;i--)
printf("%d",s[i]);
printf("\n");
}
return 0;
}