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\n",now.s,now.t);

36         if(now.s==65535||now.s==0)  //全黑or全白

37         {

38             printf("%d\n",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\n");

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 }

 

你可能感兴趣的:(poj)