Fire Net
原题链接https://vjudge.net/contest/345248#problem/K
需要判断堡垒的位置,由于堡垒直线射击所以堡垒的行列不能有其他堡垒,由于墙壁可以阻挡,就再加上墙壁的特判。
类似八皇后,一个位置一个位置进行判断。
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
char map[105][105];
long long vis[105][105];
long long sum;
long long nn;
long long pan(long long n,long long m)
{
long long i,j;
for(i=n-1; i>=0; i--)//对当前列进行判断
{
if(map[i][m]=='o')
{
return 0;
}
if(map[i][m]=='X')
{
break;
}
}
for(j=m-1;j>=0;j--)//对当前行进行判断
{
if(map[n][j]=='o')
{
return 0;
}
if(map[n][j]=='X')
{
break;
}
}
return 1;
}
void dfs(long long k,long long num)
{
long long x,y;
if(k==nn*nn)//由第一格开始遍历整个地图,走完跳出,寻找最多的方案
{
if(num>sum)
{
sum=num;
}
return ;
}
else
{
x=k/nn;//行
y=k%nn;//列
//printf("%lld ***\n",k);
if(map[x][y]=='.'&&pan(x,y))//对行列进行判断,路径是否有堡垒
{
map[x][y]='o';//o来表示放置了一个堡垒
dfs(k+1,num+1);
map[x][y]='.';
}
dfs(k+1,num);
}
}
int main()
{
while(~scanf("%lld",&nn))
{
sum=0;
if(nn==0)
{
break;
}
memset(vis,0,sizeof(vis));
memset(map,0,sizeof(map));
long long i,j;
for(i=0; i<nn; i++)
{
getchar();
for(j=0; j<nn; j++)
{
scanf("%c",&map[i][j]);//读取地图
}
}
dfs(0,0);
printf("%lld\n",sum);
}
return 0;
}