此题和八皇后类似,但是不同的是求最大放置的数量。
题意:说的是在一个棋盘中,有障碍物,你需要放置炮台,每个炮台会向四面八方射击,但是却不能击穿障碍物,所以在遇到障碍物时会停下来。求解怎样放置炮台会使炮台的数量最大。
思路:用的方法很笨,因为数据量较小所以一个一个的搜索找到在某一步时出现的最大数量,然后储存起来。用的是深搜。
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int n;
int maxx;
char map[5][5];
int vis[5][5];
int mark[5][5];
int dx[5] = {1,-1,0,0};
int dy[5] = {0,0,1,-1};
void get_first()
{
memset(vis,0,sizeof(vis));
memset(mark,0,sizeof(mark));
}
int ok(int x,int y)
{
int i,x1,y1;
if(map[x][y]!='.')
return 0;
for(i=0;i<4;i++)
{
x1=x+dx[i];y1=y+dy[i];
while(1)
{
if(x1<0||x1>=n||y1<0||y1>=n||map[x1][y1]=='X')//遇到边界跳出来
break;
else if(map[x1][y1]=='1')//遇到'X'跳出来
return 0;
x1+=dx[i];y1+=dy[i];//没有的话就沿着行和列一直找
}
}
return 1;
}
void dfs(int k)
{
int i,j;
for(i = 0 ;i < n ; i++)
{
for(j = 0 ;j < n ; j++)
{
if(ok(i,j))//判断是否能放置
{
map[i][j]='1';//如果能将其所在行和列标记为不能放置直到碰到'X'
dfs(k+1);//成功放置的话就加1
map[i][j]='.';//回溯
}
}
if(maxx < k)//寻找最大数量
{
maxx = k;
}
}
}
int main()
{
int i,j;
while(cin>>n&&n)
{
maxx = 0;
for(i = 0 ;i < n ;i++)
{
for(j = 0 ;j < n ;j++)
{
cin>>map[i][j];
}
}
dfs(0);
cout<<maxx<<endl;
}
return 0;
}