/* 题意: 一个棋盘,有黑白两种棋子。你可以翻动任一颗棋子,但是翻动有个规则,那就是该棋子周围的棋子都要跟着翻转,所谓翻转就是白变黑或黑变白。 让你求出至少要翻转的次数使得棋盘达到一种状态,该状态就是棋盘中所有棋子都是同一种颜色 */ #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); }