题目大意:
要求:碉堡不能在同一行、同一列。如果(X表示墙)X在这一行里 ,碉堡可以打不穿墙,也就是有墙可以放多个碉堡。
求一个n*n区域里最大可以放多少个碉堡。
基本上就是八皇后问题的改编,只不过如果遇到X就可以在次匹配而已。
这道题我还是用回溯法+剪枝。
#include<stdio.h>
#include<string.h>
char map[10][10];
int visit[10][10];
int n,ss,ans,t;
int judge(int x,int y)
{
int k;
if(x<0||x>=n||y<0||y>=n)
return 0;
if(map[x][y]=='X'||visit[x][y]==1)
return 0;
for(k=x-1;k>=0;k--)
{
if(map[k][y]=='X')
break;
if(visit[k][y]==1)
return 0;
}
for(k=y-1;k>=0;k--)
{
if(map[x][k]=='X')
break;
if(visit[x][k]==1)
return 0;
}
return 1;
}
void dfs(int ss)
{
int x,y;
if(ss==n*n)
{
if(ans<t)
ans=t;
return;
}
x=ss/n;y=ss%n;
if(judge(x,y))
{
t++;
visit[x][y]=1;
dfs(ss+1);
t--;
visit[x][y]=0;
dfs(ss+1);
}
else
dfs(ss+1);
}
int main()
{
int i;
while(scanf("%d",&n),n)
{
t=0;
for(i=0;i<n;i++)
{
scanf("%s",map[i]);
}
memset(visit,0,sizeof(visit));
ans=0;
dfs(0);
printf("%d\n",ans);
}
return 0;
}