POJ-1753

来源:互联网 发布:淘宝网短棉衣 编辑:程序博客网 时间:2024/05/18 03:12
/*题意:一个棋盘,有黑白两种棋子。你可以翻动任一颗棋子,但是翻动有个规则,那就是该棋子周围的棋子都要跟着翻转,所谓翻转就是白变黑或黑变白。让你求出至少要翻转的次数使得棋盘达到一种状态,该状态就是棋盘中所有棋子都是同一种颜色*/#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);}