poj 1753

翻转棋,注意是翻转周围四个的,不是整行列的  汗-_-!

哥的代码风还是不错的

二进制储存状态

Sample Input

bwwb
bbwb
bwwb
bwww

Sample Output

4
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 int n,m,t;
 9 int vis[65536];
10 struct node
11 {
12     int s,t;
13 }st;
14 int flip(int s,int i)   //当前的状态,翻第几个棋子
15 {
16     int x=i/4;
17     int y=i%4;
18     s^=(1<<i);  //翻选中的棋子
19     if(x>0) s^=(1<<(i-4));//翻转上面的
20     if(y>0) s^=(1<<(i-1));//翻转左边的
21     if(x<3) s^=(1<<(i+4));//翻转下面的
22     if(y<3) s^=(1<<(i+1));//翻转右边的
23     return s;
24 }
25 void bfs()
26 {
27     node now,next;
28     vis[st.s]=1;
29     queue<node> q;
30     q.push(st);
31     while(!q.empty())
32     {
33         now=q.front();
34         q.pop();
35         //printf("%d %d
",now.s,now.t);
36         if(now.s==65535||now.s==0)  //全黑or全白
37         {
38             printf("%d
",now.t);
39             return;
40         }
41         for(int i=0;i<16;i++)
42         {
43             next.s=flip(now.s,i);
44             next.t=now.t+1;
45             if(!vis[next.s])
46             {
47                 vis[next.s]=1;
48                 q.push(next);
49             }
50         }
51     }
52     printf("Impossible
");
53     return;
54 }
55 int main()
56 {
57     int i,j,k;
58     //freopen("1.in","r",stdin);
59     char s[5];
60     st.s=0;
61     for(i=0;i<4;i++)
62     {
63         scanf("%s",s);
64         for(j=0;j<4;j++)
65             if(s[j]=='b')   st.s+=1<<(i*4+j);
66     }
67     memset(vis,0,sizeof(vis));
68     st.t=0;
69     bfs();
70     return 0;
71 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4278583.html