枚举 POJ 1753 Flip Game

 

题目地址:http://poj.org/problem?id=1753

 1 /*  2  这题几乎和POJ 2965一样,DFS函数都不用修改  3  只要修改一下change规则。。。  4  注意:是否初始已经ok了要先判断  5 */  6 #include <cstdio>  7 #include <iostream>  8 #include <algorithm>  9 #include <cstring>  10 #include <cmath>  11 #include <string>  12 #include <map>  13 #include <queue>  14 #include <vector>  15 using namespace std;  16  17 const int MAXN = 1e6 + 10;  18 const int INF = 0x3f3f3f3f;  19 int a[5][5];  20 bool flag;  21  22 bool ok(void)  23 {  24 int tmp = a[1][1];  25 for (int i=1; i<=4; ++i)  26  {  27 for (int j=1; j<=4; ++j)  28 if (a[i][j] != tmp) return false;  29  }  30  31 return true;  32 }  33  34 void change(int x, int y)  35 {  36 a[x][y] = !a[x][y];  37 if (x > 1) a[x-1][y] = !a[x-1][y];  38 if (x < 4) a[x+1][y] = !a[x+1][y];  39 if (y > 1) a[x][y-1] = !a[x][y-1];  40 if (y < 4) a[x][y+1] = !a[x][y+1];  41 }  42  43 void DFS(int x, int y, int num, int cnt)  44 {  45 if (num == cnt)  46  {  47 flag = ok ();  48 return ;  49  }  50 for (int i=x; i<=4; ++i)  51  {  52 int j;  53 if (i == x) j = y + 1;  54 else j = 1;  55 for (; j<=4; ++j)  56  {  57  change (i, j);  58 DFS (i, j, num+1, cnt);  59 if (flag) return ;  60  change (i, j);  61  }  62  }  63 }  64  65 void work(void)  66 {  67 if (ok ())  68  {  69 printf ("%d\n", 0); return ;  70  }  71 int cnt;  72 for (cnt=1; cnt<=16; ++cnt) //最多16次,可以暴力枚举  73  {  74 flag = false;  75 DFS (1, 0, 0, cnt);  76 if (flag) break;  77  }  78 (cnt <= 16) ? printf ("%d\n", cnt) : puts ("Impossible");  79 }  80  81 int main(void) //POJ 1753 Flip Game  82 {  83 //freopen ("A.in", "r", stdin);  84  85 char ch;  86 for (int i=1; i<=4; ++i)  87  {  88 for (int j=1; j<=4; ++j) //b-0 w-1  89  {  90 scanf ("%c", &ch);  91 a[i][j] = (ch == 'b') ? 0 : 1;  92  }  93  getchar ();  94  }  95  96  work ();  97  98 return 0;  99 } 100 101 /* 102 Impossible 103 */

 

你可能感兴趣的:(game)