#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;
}
poj1753 flip game
中文翻譯在這裏,http://blog.sina.com.cn/s/blog_61eccf0e0100g1gs.html
這道題目是一個翻牌問題,對於同一格,翻1次,格子會變得和原來相反,再翻一次,那麼格子就會變回原來的內容,在翻一次,格子又會變得相反。
因此,我們可以知道,翻牌翻奇數次的效果跟翻一次是一樣的,翻偶數次是不會改變棋盤內容的。
因此對於一個4*4的棋盤來說,最多隻能翻16次。
那麼我們就可以把4*4的棋盤內容全都一樣作爲最終判斷的結果,以輸入棋盤的內容作爲起點,然後枚舉翻牌n次的每一種可能。看看哪一次能夠得出最終結果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.