题意:
就是会给你一些点架设炮台,一架炮台的一行,一列不能再架设炮台,但是有墙除外;
思路:
一,这道题和N皇后差不多,但是不同的是会有一些墙,这些墙变成了问题,为什么呢?
1,他会终止搜索,所以当你发现你的到结果少了,很可能是搜索被中断了
二,那些地方我们能架设炮台那?
1,我们需要从该点出发去判断,判断他的行和列是否有炮台,如果没有则可以放,但是如果遇到强,则该方向不在差,然后枚举给地图的每一点,判断能不能放,
相信以上两点,代码就清楚了
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int n,m;
int map[8][8],vis[8][9];
bool cmd(int x,int y) // 判断该点是否可以放
{
if(x<1||x>n||y<1||y>n)return false;
for(int i = y;i>=1;i--)
{
if(vis[x][i]==1)
return false;
if(map[x][i]==-1)
break;
}
for(int i=y;i<=n;i++)
{
if(vis[x][i]==1)
return false;
if(map[x][i]==-1)
break;
}
for(int i=x;i<=n;i++)
{
if(vis[i][y]==1)
return false;
if(map[i][y]==-1)
break;
}
for(int i=x;i>=1;i--)
{
if(vis[i][y]==1)
return false;
if(map[i][y]==-1)
break;
}
return true;
}
int Max;
void dfs(int count)
{
if(count>Max)
Max = count;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) // 该方法可能会有点慢,原因是每次都要遍历全图,但是思路清晰(并且这道题地图小)
if(cmd(i,j)&&map[i][j]!=-1)
{
vis[i][j] = 1;
dfs(count+1);
vis[i][j] = 0 ;
}
}
}
int main()
{
while(cin>>n,n)
{
getchar();
Max = -100000;
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
char c = getchar();
switch(c)
{
case 'X' : map[i][j] = -1;break;
case '.': map[i][j] = 0;break;
}
}
getchar();
}
dfs(0);
printf("%d\n",Max);
}
}