转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents
题目链接:http://poj.org/problem?id=1753
Description
Consider the following position as an example: Input
Output
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
题意:找出能使4X4的棋盘中的棋子同色的最小步数!
代码如下:
#include <iostream>
#include <cstring>
using namespace std;
int chess[7][7];//其实利用的只有中心的4x4
int x[5] = {0,0,1,0,-1};
int y[5] = {0,1,0,-1,0};
int flag, step;
int judge(int chess[7][7])//判断颜色是否全部相同
{
for(int i = 1; i <= 4; i++)
{
for(int j = 1; j <= 4; j++)
{
if(chess[i][j] != chess[1][1])
return 0;
}
}
return 1;
}
void flip(int row, int col)//翻棋
{
for(int i = 0; i <= 4; i++)
{
if(chess[row+x[i]][col+y[i]] == 1)
chess[row+x[i]][col+y[i]] = 0;
else
chess[row+x[i]][col+y[i]] = 1;
}
return;
}
void dfs(int row,int col, int deep)//深搜固定步数看是否能同色
{
if(deep == step)
{
flag = judge(chess);
return;
}
if(flag || row == 5)
return;
flip(row,col);
if(col < 4)
dfs(row,col+1,deep+1);
else
dfs(row+1,1,deep+1);
flip(row,col);//不符合就翻回之前的状态
if(col < 4)
dfs(row,col+1,deep);
else
dfs(row+1,1,deep);
return;
}
int main()
{
char temp;
int i, j;
memset(chess,0,sizeof(chess));
for(i = 1; i <= 4; i++)
{
for(j = 1; j <= 4; j++)
{
cin >>temp;
if(temp == 'b')
chess[i][j] = 1;
}
}
for(step = 0; step <= 16; step++)
{//对每一步进行枚举(Enum)
dfs(1,1,0);
if(flag)
break;
}
if(flag)
cout<<step<<endl;
else
cout<<"Impossible"<<endl;
return 0;
}poj1753 Flip Game(枚举Enum+dfs),布布扣,bubuko.com
原文地址:http://blog.csdn.net/u012860063/article/details/37603321