题目类似于八皇后的问题,炮塔可以打四个方向无限远,但是无法穿过墙,问你一个地图最多可以放多少个炮塔而不互相攻击
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char map[5][5];
int vis[5][5];
int n;
int maxx;
int judge(int xx,int yy)
{
int i;
for(i=xx;i>=0;i--)
{
if(vis[i][yy]==1)
return 0;
if(map[i][yy]=='X')
break;
}
for(i=yy;i>=0;i--)
{
if(vis[xx][i]==1)
return 0;
if(map[xx][i]=='X')
break;
}
return 1;
}
void dfs(int num,int cnt)//num是当前搜索到的点,cnt已经放置炮台的数量
{
if(num==n*n) //num是从1到n*n的,怎样根据num得到x,y在下边
{
maxx=max(maxx,cnt);
return;
}
int x=num/n; //获取当前点的坐标
int y=num%n;
if(map[x][y]=='.'&&judge(x,y))
{
vis[x][y]=1;
dfs(num+1,cnt+1);
vis[x][y]=0;
}
dfs(num+1,cnt);
}
int main()
{
while(scanf("%d",&n)&&n)
{
int i,j;
maxx=0;
for(i=0;i<n;i++)
{
scanf("%s",map[i]);
}
dfs(0,0);
/* for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<a[i][j];
}
printf("\n");
} */
cout<<maxx<<endl;
}
return 0;
}