poj1753 flip game

中文翻譯在這裏,http://blog.sina.com.cn/s/blog_61eccf0e0100g1gs.html
這道題目是一個翻牌問題,對於同一格,翻1次,格子會變得和原來相反,再翻一次,那麼格子就會變回原來的內容,在翻一次,格子又會變得相反。
因此,我們可以知道,翻牌翻奇數次的效果跟翻一次是一樣的,翻偶數次是不會改變棋盤內容的。
因此對於一個4*4的棋盤來說,最多隻能翻16次。
那麼我們就可以把4*4的棋盤內容全都一樣作爲最終判斷的結果,以輸入棋盤的內容作爲起點,然後枚舉翻牌n次的每一種可能。看看哪一次能夠得出最終結果。
#include <iostream>
using namespace std;
int rnext[5][2] = { 0,0,0,-1,0,1,-1,0,1,0 };
bool flag;
bool map[6][6] = {false};
int step;
bool judge()
{
 int i, j;
 for (i = 1; i <= 4; i++)
  for (j = 1; j <= 4; j++)
   if (map[i][j] != map[1][1])
    return false;
 return true;
}
void flip(int row, int col)
{
 int i;
 for (i = 0; i < 5; i++)
 {
  map[row + rnext[i][0]][col + rnext[i][1]] = !map[row + rnext[i][0]][col + rnext[i][1]];
 }
 return;
}
void dfs(int row, int col, int deep)
{
 int i, j;
 if (deep == step)
 {
  flag = judge();
  return;
 }
 if (flag || row == 5)
  return;
 flip(row, col);
 if (col < 4)
  dfs(row, col + 1, deep + 1);
 else
  dfs(row + 1, 1, deep + 1);
 flip(row, col);
 if (col < 4)
  dfs(row, col + 1, deep);
 else
  dfs(row + 1, 1, deep);
 return;
}
int main()
{
 char temp;
 int i, j;
 for (i = 1; i <= 4; i++)
  for (j = 1; j <= 4; j++)
  {
   cin >> temp;
   if (temp == 'b')
    map[i][j] = true;
  }
 for (step = 0; step <= 16; step++)
 {
  dfs(1,1,0);
  if (flag)
   break;
 }
 if (flag)
  cout << step << endl;
 else
  cout << "Impossible" << endl;
 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章