POJ-1753

/*
题意:

一个棋盘,有黑白两种棋子。你可以翻动任一颗棋子,但是翻动有个规则,那就是该棋子周围的棋子都要跟着翻转,所谓翻转就是白变黑或黑变白。
让你求出至少要翻转的次数使得棋盘达到一种状态,该状态就是棋盘中所有棋子都是同一种颜色
*/

#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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值