一个4*4的棋盘,怎样按才能最少的按下方格,使之全白或全黑。
每个方格仅需按一遍,枚举按的16个方格按或不按。得出的结果是全黑或全白就输出即可。
dfs加枚举。
可以用位运算进行优化,目前我还不会。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
bool map[6][6]={false};
int dx[6]={-1,1,0,0,0};
int dy[6]={0,0,-1,1,0};
int step;
bool flag=false;
bool judge(void)
{
int i,j;
for(i=1;i<5;i++)
for(j=1;j<5;j++)
if(map[i][j]!=map[1][1])
return false;
return true;
}
void flip(int x,int y)
{
for(int i=0;i<5;i++)
map[x+dx[i]][y+dy[i]]=!map[x+dx[i]][y+dy[i]];
}
void dfs(int x,int y,int d)
{
if(d==step)
{
flag=judge();
return;
}
if(flag||x==5)
return;
flip(x,y);
if(y<4)
dfs(x,y+1,d+1);
else
dfs(x+1,1,d+1);
flip(x,y);
if(y<4)
dfs(x,y+1,d);
else
dfs(x+1,1,d);
return ;
}
int main(){
char temp;
int i,j;
for(i=1;i<5;i++)
for(j=1;j<5;j++)
{
cin>>temp;
if(temp=='b')
map[i][j]=true;
}
for(step=0;step<=16;step++)
{
dfs(1,1,0);
if(flag)
break;
}
if(flag)
cout<<step<<endl;
else
cout<<"Impossible"<<endl;
return 0;
}
一个好的解题报告http://www.cnblogs.com/lyy289065406/archive/2011/07/29/2120501.html