首页 > 代码库 > zoj3675 BFS+状态压缩
zoj3675 BFS+状态压缩
#include <stdio.h> #include <string.h> #include <queue> using namespace std; int n; int vis[10000000]; int mode1,mode2; struct node { int step,status; }; void print(int x) { int tmp=x%2; if (!(x==0 || x==1)) print(x>>1); printf("%d",tmp); } int main() { int i,j,m,n; char str[100]; while (scanf("%d",&n)!=EOF) { memset(vis,0,sizeof(vis)); scanf("%s",str); scanf("%d",&m); // printf("!!1"); mode1=mode2=0; //printf("%s\n",str); for (i=0;str[i]!=‘\0‘;i++) mode1=(mode1<<1)+(str[i]==‘*‘?1:0); for (i=strlen(str)-1;i>=0;i--) mode2=(mode2<<1)+(str[i]==‘*‘?1:0); // printf("mode1=%d\n",mode1); node tmp; tmp.step=0; tmp.status=0; int end=(1<<m)-1; queue<node> q; q.push(tmp); vis[tmp.status]=1; int full=0; for (i=0;i<m;i++) full=(full<<1)+1; node tmp2; int flag=1; while (!q.empty()) { // printf("@@@\n"); tmp=q.front(); q.pop(); tmp.status=tmp.status<<(n-1); for (i=0;i<(n+m);i++) { int nw=((tmp.status|(mode1<<i))>>(n-1))&(full); // printf("nw="); // print(nw); // printf(" %d\n",i); if (vis[nw]==0) { vis[nw]=1; tmp2.status=nw; tmp2.step=tmp.step+1; if (tmp2.status==end) { printf("%d\n",tmp2.step); flag=0; break; } q.push(tmp2); // printf("%d %d\n",tmp2.status,tmp2.step); } } if (!flag) break; for (i=0;i<(n+m);i++) { int nw=((tmp.status|(mode2<<i))>>(n-1))&(full); // printf("nw=%d\n",nw); // printf("nw2="); // print(nw); // printf(" %d\n",i); if (vis[nw]==0) { vis[nw]=1; tmp2.status=nw; tmp2.step=tmp.step+1; if (tmp2.status==end) { printf("%d\n",tmp2.step); flag=0; break; } q.push(tmp2); // printf("%d %d\n",tmp2.status,tmp2.step); } } if (!flag) break; } if (flag==1) printf("-1\n"); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。