描述:一个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】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/75925
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!