http://acm.hdu.edu.cn/showproblem.php?pid=2209
题解:把所有的状态看成01二进制,状态压缩,比较简单的bfs+状态压缩
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define M 1<<20+1
bool vis[M];
int l;
struct node{
int st,move;
};
int bfs(int res){
memset(vis,false,sizeof(vis));
node p,q;
queue<node> Q;
p.move = 0;p.st = res;
Q.push(p);
while(!Q.empty()){
q = Q.front();Q.pop();
if(!q.st) return q.move;
for(int i = 0;i < l;i++){
p = q;
if(!i) p.st = p.st ^ 3;//翻转第一个,只影响第二个
else p.st = p.st ^ (7 <<(i-1));//中间翻转
p.st &= (1<<l) - 1;//防溢出,不影响其结果
if(vis[p.st]) continue;
vis[p.st] = true;
p.move = p.move + 1;
Q.push(p);
}
}
return -1;
}
int main(){
char str[30];
while(~scanf("%s",str)){
l = strlen(str);
int sum = 0;
for(int i = 0;i < l;i++)
sum = sum * 2 + str[i] - '0';
int ans = bfs(sum);
if(ans != -1) cout << ans << endl;
else cout << "NO" << endl;
}
return 0;
}