这题只需要从终点0开始广搜,直到搜索到输入的字符串终止
如果搜索不到 则输出NO
搜索途中的每一个状态都用一个二进制数表示,搜索过的状态作标记表示不再搜索
这题使用位运算会非常爽 , 让我对位运算更加熟练了
位运算简介及实用技巧
http://www.matrix67.com/blog/archives/263
代码:
#include <stdio.h>
#include <math.h>
#include <string.h>
struct node
{
int num;
int step;
}a[2000000];
int vis[2000000];
int main()
{
char ch[22];
while(scanf("%s",&ch)!=EOF)
{
int len= strlen(ch);
int nn= 0;
for(int i= 0; i< len; i++)
nn+= (ch[i]-'0') * pow(2.0, 1.0*(len-i-1));
if(len == 1)
{
if(nn == 0)
printf("0\n");
else
printf("1\n");
continue;
}
memset(vis, -1, sizeof(vis));
int front= 0;
int rear= 0;
a[0].num= 0;
a[0].step= 0;
vis[0]= 1;
int ans= -1;
//printf("%d\n",nn);
while(front<= rear)
{
if(a[front].num == nn)
{
ans= a[front].step;
break;
}
int v= a[front].num^(1)^(1<<1);
if(vis[v]==-1)
{
vis[v]= 1;
rear++;
a[rear].num= v;
a[rear].step= a[front].step+ 1;
}
v= a[front].num^(1<<(len-2))^(1<<(len-1));
if(vis[v]==-1)
{
vis[v]= 1;
rear++;
a[rear].num= v;
a[rear].step= a[front].step+ 1;
}
for(int i= 2; i<= len-1; i++)
{
v= a[front].num^(1<<(i-2))^(1<<(i-1))^(1<<(i));
if(vis[v]==-1)
{
vis[v]= 1;
rear++;
a[rear].num= v;
a[rear].step= a[front].step+ 1;
}
}
front++;
}
// printf("hehe\n");
if(ans== -1)
printf("NO\n");
else
printf("%d\n",ans);
}
return 0;
}