首页 > 代码库 > 黑白棋游戏

黑白棋游戏

二进制串的储存是个细节比较多的问题qaq
然后各个位置的查询也有些地方要注意
这次真的是改到吐了qwq

不过我似乎比写了很多exchange的代码短一点(就是时间花的有点久(倒地身亡

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<string>
 7 #define ll long long
 8 using namespace std;
 9 int t[1<<18],fax[1<<18],fay[1<<18],fa[1<<18],y[1<<18],a[20];
10 bool vis[1<<20];
11 void cou(int x){
12     int t1=x/4+1,t2=x%4+1;
13     cout<<t1<<" "<<t2<<" ";
14 }
15 void pr(int x){
16     if (!fa[x]) return ;
17     pr(fa[x]);
18     cou(fax[x]),cou(fay[x]);
19     cout<<endl;
20 }
21 int main(){
22     int x;
23     int ch=0,zh=0;
24     for (int i=1;i<=16;++i) scanf ("%1d",&a[i]);
25     for (int i=16;i>=1;--i){
26             ch<<=1;
27             ch|=a[i];
28     }
29     for (int i=1;i<=16;++i) scanf ("%1d",&a[i]);
30     for (int i=16;i>=1;--i){
31             zh<<=1;
32             zh|=a[i];
33     }
34     t[1]=ch;
35     int h=0,ta=1,q,p;
36     while (h<ta){
37         int x=t[++h];
38         vis[x]=1;
39         int flag=0;
40         int to=ch;
41         for (int i=0;i<16;++i){
42             if (i<12) {
43                 if ((x&(1<<i))&&(!(x&(1<<i+4)))) to=x&(~(1<<i)),to|=(1<<i+4);
44                 else if ((x&(1<<i+4))&&(!(x&(1<<i)))) to=x&(~(1<<i+4)),to|=(1<<i);
45                 if (!vis[to]) t[++ta]=to,vis[to]=1,fa[to]=x,fax[to]=i,fay[to]=i+4,y[to]=y[x]+1;
46             }
47             if (to==zh){flag=1;break;}
48             if (i!=3&&i!=7&&i!=11&&i!=15){
49                 if ((x&(1<<i))&&(!(x&(1<<i+1)))) to=x&(~(1<<i)),to|=(1<<i+1);
50                 else if ((x&(1<<i+1))&&(!(x&(1<<i)))) to=x&(~(1<<i+1)),to|=(1<<i);
51                 if (!vis[to]) t[++ta]=to,vis[to]=1,fa[to]=x,fax[to]=i,fay[to]=i+1,y[to]=y[x]+1;
52             }
53             if (to==zh){flag=1;break;}
54         }
55         if (flag) {q=to;break;}
56         }
57     cout<<y[q]<<endl;
58     pr(q);
59     return 0;
60 }

 

黑白棋游戏