看题目的时候,联想到八皇后的问题,就稍微了解了一下有关八皇后的解法:http://blog.csdn.net/bone_ace/article/details/41419695
但这道题与八皇后问题不同在于,多了墙这种元素,但解题的思想还是一致的,既dfs。
具体看代码中的注释。
#include<stdio.h>
#include<string.h>
using namespace std;
char map[6][6];
int ans,n;
int check(int x,int y)//判断此点能不能建城堡
{
for(int i=x-1;i>=0;i--)
{
if(map[i][y]=='1')return 1;
if(map[i][y]=='X')break;
}
for(int j=y-1;j>=0;j--)
{
if(map[x][j]=='1')return 1;
if(map[x][j]=='X')break;
}
return 0;
}
void dfs(int u,int sum)
{
if(u==n*n)//遍历完成
{
if(sum>ans)ans=sum;//筛选最大建造数的情况
return;
}
else
{
int x=u/n;int y=u%n;
if(map[x][y]=='.'&&!check(x,y))
{
map[x][y]='1';//在(x,y) 处建城堡
dfs(u+1,sum+1);//按照一行一行从左到右的顺序遍历
map[x][y]='.';//回溯
}
dfs(u+1,sum);//没有选择在(x,y) 处建城堡便直接到下一个点
}
}
int main()
{
while(~scanf("%d",&n)&&n!=0)
{
ans=-1;
for(int i=0;i<n;i++)
scanf("%s",map[i]);
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}