看到题目的瞬间就想到了将所有纸牌的状态用二进制表示出来,20张牌刚好有大概一百万种状态,一百万种,从刚开始学BFS搜迷宫开始,差不多是我遇到的BFS里最经常碰见的状态数量了。
通过位运算来实现状态的转移,然后搜索所有的状态,最快搜索到的就是结果,如果搜索完所有能到达的状态仍然没有到达目标状态的时候,输出NO。
#include<stdio.h>
#include<string.h>
#define N 25
char s[N];
int n;
int start,end;
int vis[(1<<20)+1];
struct node
{
int x,cnt;
}q[(1<<N)+1];
int BFS()
{
node cur,next;
cur.x=start;
cur.cnt=0;
vis[start]=1;
int head,tail;
head=tail=0;
q[tail++]=cur;
while(head!=tail)
{
cur=q[head++];
int temp=1;
next.cnt=cur.cnt+1;
for(int i=0;i<n;i++)
{
if(i<2) temp=(temp<<1)+1;
else temp<<=1;
if(i==n-1) temp&=(temp>>1);
next.x=cur.x^temp;
if(next.x==end) return next.cnt;
if(vis[next.x]==0)
{
q[tail++]=next;
vis[next.x]=1;
}
}
}
return -1;
}
int main()
{
while(gets(s))
{
n=strlen(s);
start=0;end=0;
for(int i=0;i<n;i++) start=start*2+s[i]-'0';
if(start==end)
{
printf("0\n");
continue;
}
if(n==1&&start!=end)
{
printf("1\n");
continue;
}
int ans;
memset(vis,0,sizeof(vis));
ans=BFS();
if(ans==-1) printf("NO\n");
else printf("%d\n",ans);
}
return 0;
}