算法学习之路|翻转棋

4*4的翻转棋(翻一个棋子的颜色会同时反转上下左右的棋子颜色),给一个棋盘状况,求把所有棋子翻成同色最少需要翻多少次
输入格式:输入4*4的棋盘,b’代表黑,w代表白

输出格式:输出一个数字,表示最少翻多少次,没有解就输出Impossable

输入样例:
bwwb
bbwb
bwwb
bwww

输出样例:
4
解题思路:经典的搜索题,深搜即可。
刚学搜索时写过,但没有ac,重写一次

#include  
#include
#include
using namespace std;  
int chess[4][4];  
int c=33;  
void build()
{  char c;  int i,j;  for(i=0;i<4;i++)  for(j=0;j<4;j++)  {  cin>>c;if(c=='w')  chess[i][j]=0;  else  chess[i][j]=1;  }  
}  
void turn(int x,int y) 
{  if(x>=0&&x<=3&&y>=0&&y<=3)  chess[x][y]=!chess[x][y];  
}  
void flip(int s)
{  int i=s/4; int j=s%4;turn(i,j);  turn(i+1,j);  turn(i,j+1);  turn(i-1,j);  turn(i,j-1);  
}  
int judge()
{  int i,j,s1=0;  for(i=0;i<4;i++)  for(j=0;j<4;j++)  s1+=chess[i][j];  if(s1%16)  return 0;  else  return 1;  
}  
void dfs(int s,int b)
{  if(judge()) {  if(c>b)  c=b;  return;  }  if(s>=16)return;  dfs(s+1,b);  flip(s);  dfs(s+1,b+1);  flip(s);  
}  
int main()  
{  build();dfs(0,0);  if(c==33)printf("Impossible\n");  else  printf("%d\n",c);  return 0;  
}  


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部