这是一道典型的DFS+回溯的题目,题目类似于皇后问题,但是多了限制条件,就是一行中可以有多个blockhouse,如果在他们之间有wall的话。
代码如下:
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int mymap[5][5];
int n,ans;
int Judge(int a,int b)//判断在(a,b)之前是否有wall或者是走过的空格
{
int i;
for(i=a;i>=0;i--)
{
if(mymap[i][b]==2) return 0;
if(mymap[i][b]==1) break;
}
for(i=n;i>=0;i--)
{
if(mymap[a][i]==2) return 0;
if(mymap[a][i]==1) break;
}
return 1;
}
void dfs(int k,int max)
{
if(k==n*n)
{
if(max>ans)
{
ans=max;
return;
}
}
else
{
int x=k/n;
int y=k%n;
if(mymap[x][y]==0&&Judge(x,y))
{
mymap[x][y]=2;
dfs(k+1,max+1);
mymap[x][y]=0;//回溯
}
dfs(k+1,max);
}
}
int main()
{
int i,j;
char ch;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
getchar();
memset(mymap,0,sizeof(mymap));
for(i=0;i<n;i++){
for(j=0;j<n;j++)
{
scanf("%c",&ch);
if(ch=='.')
mymap[i][j]=0;
if(ch=='X')
mymap[i][j]=1;
}getchar();
}
ans=0;
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}