/*
题意:
一个棋盘,有黑白两种棋子。你可以翻动任一颗棋子,但是翻动有个规则,那就是该棋子周围的棋子都要跟着翻转,所谓翻转就是白变黑或黑变白。
让你求出至少要翻转的次数使得棋盘达到一种状态,该状态就是棋盘中所有棋子都是同一种颜色
*/
#include<stdio.h>
#include<string.h>
int sum = 33;
char squares[17];
void change(int x)
{
squares[x] = !(squares[x]-'0')+'0';
if (x >= 4)
squares[x-4] = !(squares[x-4]-'0')+'0';
if (x < 15 && x%4 != 3)
squares[x+1] = !(squares[x+1]-'0')+'0';
if (x > 0 && x%4 != 0)
squares[x-1] = !(squares[x-1]-'0')+'0';
if (x <= 11)
squares[x+4] = !(squares[x+4]-'0')+'0';
}
int goal(int x, int num)
{
if (!strcmp(squares, "1111111111111111") || !strcmp(squares, "0000000000000000")) {
if (sum > num)
sum = num;
return;
}
if (x >= 16) return;
// 不翻转这个棋子
goal(x+1, num);
// 翻转这个棋子,步数加1
change(x);
goal(x+1, num+1);
// 返回调用函数,要还原棋子
change(x);
}
main()
{
int i, c;
for (i=0; i < 16;)
switch ((c=getchar())) {
case 'b' : squares[i++] = '1'; break;
case 'w' : squares[i++] = '0'; break;
}
squares[i] = '\0';
//printf("%s\n",squares);
goal(0, 0);
if (sum == 33)
printf("Impossible");
else
printf("%d", sum);
}
POJ-1753
最新推荐文章于 2019-01-01 15:26:29 发布