flip game

描述:一个4*4的棋盘棋子有黑和白两种状态,每次可以对任意点操作,改变它本身和上下左右(如果有的话)棋子的颜色,求最少多少次操作可以把棋盘变成同一颜色

方法:枚举,深度搜索,输入用C++的cin比较好,本人是用C输入的,有点拙计

#include <stdio.h>

#include <stdlib.h>

int qipan[4][4];

int c=33;

void shuru()

{     int i;    

       char a1[5],a2[5],a3[5],a4[5];    

       scanf("%s\n%s\n%s\n%s",&a1,&a2,&a3,&a4);    

       for(i=0;i<4;i++)    

        {         if(a1[i]=='w') qipan[0][i]=0;        

                  else qipan[0][i]=1;        

                  if(a2[i]=='w') qipan[1][i]=0;        

                  else qipan[1][i]=1;        

                  if(a3[i]=='w') qipan[2][i]=0;        

                  else qipan[2][i]=1;        

                  if(a4[i]=='w') qipan[3][i]=0;        

                  else qipan[3][i]=1;    

       }

}

void turn(int i,int j)

{     if(i>=0&&i<=3&&j>=0&&j<=3)    

       qipan[i][j]=!qipan[i][j];

}

void simian(int s)

{     int i=s/4;    

       int j=s%4;    

       turn(i,j);    

       turn(i-1,j);    

       turn(i,j-1);    

       turn(i,j+1);    

       turn(i+1,j);

}

int wancheng()

{     int sum=0, i, j;    

       for(i=0;i<4;i++)     

       for(j=0;j<4;j++)     

      sum=sum+qipan[i][j];    

     if(sum%16) return 0;    

      else return 1;

}

void cnm(int s,int b)

{     if(wancheng())    

      {         if(c>b)         c=b;        

            return;     

       }    

       if(s>=16) return;    

       cnm(s+1,b);    

       simian(s);    

       cnm(s+1,b+1);    

       simian(s);

}

int main()

{     shuru();   

       cnm(0,0);    

      if(c==33) printf("Impossible\n");    

      else printf("%d",c);

    return 0;

}

原文链接: https://www.cnblogs.com/woshiwawa/archive/2013/01/17/2864402.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    flip game

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/75925

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午5:13
下一篇 2023年2月9日 下午5:13

相关推荐