水题一道,有多种解法,用的DFS写的,还可以用递归枚举
POJ 1753,题目链接http://poj.org/problem?id=1753,翻译一下整个题目的大概意思:
有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白->黑)时,其周围上下左右(如果存在的话)的格子的颜色也被反转,问至少反转几个格子可以使4*4的正方形变为纯白或者纯黑?
DFS:
#include <stdio.h>
const int inf=9999999;
char s[10];
int map[10][10],i,j;
int ans=inf;
int panduan()
{
int x=map[0][0];
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
if (map[i][j]!=x)
return 0;
}
}
return 1;
}
void fan (int x,int y)
{
map[x][y]=!map[x][y];
if (x - 1 >= 0)
map[x-1][y]=!map[x-1][y];
if (x + 1 < 4)
map[x+1][y]=!map[x+1][y];
if (y - 1 >= 0)
map[x][y-1]=!map[x][y-1];
if (y + 1 < 4)
map[x][y+1]=!map[x][y+1];
}
int dfs (int x,int y,int t)
{
if ( panduan())
{
if (ans > t)
ans = t ;
return 0;
}
if (x >= 4 || y >= 4)
return 0;
int nx,ny;
nx = (x + 1)%4;
ny = y + ( x + 1 ) / 4;
dfs (nx,ny,t);
fan (x,y);
dfs (nx,ny,t+1);
fan (x,y);
return 0;
}
int main ()
{
for (i=0; i<4; i++)
{
scanf ("%s",s);
for (j=0; j<4; j++)
{
if (s[j]=='b')
map[i][j]=0;
else
map[i][j]=1;
}
}
dfs (0,0,0);
if (ans == inf )
printf ("Impossible\n");
else printf ("%d\n",ans);
return 0;
}
使用DFS要考虑时间复杂度,