翻棋

  1 #include <iostream>
  2 using namespace std;
  3 #define SIZE 4
  4 char map[SIZE][SIZE];
  5 char map1[SIZE][SIZE];
  6 int Dx[5]={0,0,0,1,-1};
  7 int Dy[5]={0,1,-1,0,0};
  8 int num[16];
  9 int n=0;
 10 int minn=20;
 11 void fan(int step);
 12 bool same();
 13 void fanqi(int x,int y);
 14 bool safe(int x,int y);
 15 int main()
 16 {
 17     for(int i=0;i<SIZE;i++)
 18     {
 19         for(int j=0;j<SIZE;j++)
 20             cin >>map[i][j];
 21     }
 22     fan(0);
 23     if(minn==20)
 24         cout <<"Impossible";
 25     else
 26         cout <<minn;
 27     return 0;
 28 
 29 }
 30 void fan(int step)
 31 {
 32     int x;
 33     int y;
 34     if(step==16)
 35     {
 36         n=0;
 37         for(int i=0;i<SIZE;i++)
 38         {
 39             for(int j=0;j<SIZE;j++)
 40                 map1[i][j]=map[i][j];
 41         }
 42         for(int i=0;i<16;i++)
 43         {
 44             if(num[i]==1)
 45             {
 46                 x=i/4;
 47                 y=i%4;
 48                 fanqi(x,y);
 49                 n++;
 50             }
 51             
 52         }
 53         if(same())
 54         {
 55             if(n<minn)
 56                 minn=n;
 57         }
 58         return;
 59     }
 60     num[step]=0;
 61     fan(step+1);
 62     num[step]=1;
 63     fan(step+1);
 64 }
 65 
 66 
 67 
 68 void fanqi(int x,int y)
 69 {
 70     int mx;
 71     int my;
 72     for(int i=0;i<5;i++)
 73     {
 74         mx=x+Dx[i];
 75         my=y+Dy[i];
 76         if(safe(mx,my))
 77         {
 78             if(map1[mx][my]=='b')
 79                 map1[mx][my]='w';
 80             else
 81                 map1[mx][my]='b';
 82         }
 83     }
 84 }
 85 bool safe(int x,int y)
 86 {
 87     bool ret=true;
 88     if(x<0||y<0||x>=SIZE||y>=SIZE)
 89         ret=false;
 90     return ret;
 91 }
 92 bool same()
 93 {
 94     bool ret=true;
 95     for(int i=0;i<SIZE;i++)
 96     {
 97         for(int j=0;j<SIZE;j++)
 98         {
 99             if(map1[i][j]=='b')
100                 ret=false;
101         }
102     }
103     if(ret==false)
104     {
105         ret=true;
106         for(int i=0;i<SIZE;i++)
107         {
108             for(int j=0;j<SIZE;j++)
109             {
110                 if(map1[i][j]=='w')
111                     ret=false;
112             }
113         }
114     }
115     return ret;
116 }

 

posted @ 2017-01-24 14:47  jintg  阅读(235)  评论(0)    收藏  举报