Fire Net(HD1045)
原体链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045
解题思路:用dfs进行搜索
示例:. . . 搜索第一个点,可以放置碉堡,标记为'O',接下来的点都不能放置,然后回溯到第一个点,此时第一个点为'.',在搜索第二个点,放置碉堡,第三个点不能放,
. X X 标记为'O',第四个点可放置,标记为'O',继续往后搜索时,其他顶点都不能放置,回溯到第四个顶点,此时第四个顶点为'.',继续往后搜索,搜到第七个顶点时可放置碉堡...
. X X代码:
#include<stdio.h>
using namespace std;
char map[4][4];
int max,temp,n;
void dfs(int num)
{
if(num==n*n)
{
if(max<temp)
max=temp;
return;
}
int row=num/n;
int col=num%n;
bool judge=true;//true是可以安装
if(map[row][col]=='.'){
for(int i=row-1;i>=0&&judge;i--)
{
if(map[i][col]=='X')break;
if(map[i][col]=='O')
{
judge=false;
break;
}
}
for(int j=col-1;j>=0&&judge;j--)
{
if(map[row][j]=='X')break;
if(map[row][j]=='O')
{
judge=false;
break;
}
}
if(judge)
{
temp++;
map[row][col]='O';
dfs(num+1);
temp--;
map[row][col]='.';
}
}
dfs(num+1);
}
int main()
{
while(~scanf("%d",&n)&&n!=0){
max=0;temp=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%1s",&map[i][j]);
dfs(0);
printf("%d\n",max);
}
}

浙公网安备 33010602011771号