黑白棋游戏(或是叫再破难关)——稍微用了下状态压缩的bfs

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑白棋游戏(或是叫再破难关)——稍微用了下状态压缩的bfs相关的知识,希望对你有一定的参考价值。

  洛谷和CodeVS 上叫做黑白棋游戏,要求输出路径。CodeVS 上没有spj,洛谷上有但是我的输出总是直接报错。最后找到了Vijos 上的再破难关,一样的题,只是不需要输出路径,交了就对了。

技术分享
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<queue>
 7 using namespace std;
 8 const int xdr[]={4,-4,1,-1},ax[]={-1,1,0,0},ay[]={0,0,-1,1};//上 下 左 右 
 9 struct node{int num,s;};
10 
11 int sx,tx,mark=15,res,code[8][8],cnt,fth[2<<18],mv[2<<18];
12 bool vis[2<<18];
13 
14 void bfs(){
15     queue<node> q;
16     q.push((node){sx,0});
17     vis[sx]=true;
18     fth[sx]=0;
19     
20     while(!q.empty()){
21         int x=q.front().num,s=q.front().s;
22         if(x==tx){
23             cout<<s<<endl;
24             exit(0);
25         }
26         q.pop();
27         
28         
29         for(int i=1;i<=4;i++)
30             for(int j=1;j<=4;j++)
31                 if(x&code[i][j])
32                     for(int k=0;k<4;k++){
33                         if((k==0&&i==1)||(k==1&&i==4)||
34                            (k==2&&j==1)||(k==3&&j==4)||
35                            (x&code[i+ax[k]][j+ay[k]]))
36                             continue;
37                         
38                         int nx=x+code[i+ax[k]][j+ay[k]]-code[i][j];
39                         if(vis[nx])continue;
40                         vis[nx]=true;
41                         
42                         mv[nx]=i*1000+j*100+(i+ax[k])*10+j+ay[k];
43                         
44                         fth[nx]=x;
45                         q.push((node){nx,s+1});
46                         
47                     }
48     }
49 }
50 
51 int main(){
52     for(int i=1;i<=4;i++)
53         for(int j=1;j<=4;j++)
54             code[i][j]=1<<mark--;
55         
56     mark=15;
57     for(int i=1;i<=4;i++){
58         for(int j=1;j<=4;j++){
59             char c=getchar();
60             sx+=(1<<mark)*(c==1);
61             mark--;
62         }
63         getchar();
64     }
65     getchar();
66     mark=15;
67     for(int i=1;i<=4;i++){
68         for(int j=1;j<=4;j++){
69             char c=getchar();
70             tx+=(1<<mark)*(c==1);
71             mark--;
72         }
73         getchar();
74     }
75     mark=0;
76     bfs();
77     return 0;
78 }
Method_01

  Vijos 63ms

以上是关于黑白棋游戏(或是叫再破难关)——稍微用了下状态压缩的bfs的主要内容,如果未能解决你的问题,请参考以下文章

Vijos CoVH之再破难关(搜索+hash)

POJ 1753 Flip game状态压缩+广搜

所有可能的路径---对何时使用bfs+状态压缩的稍微总结

P1278 单词游戏

bzoj千题计划200:bzoj3106: [cqoi2013]棋盘游戏

百度百科中的黑白效果是如何实现的