版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
题解-火力网
Description
给你张NN的地图,地图上有墙,用"X"表示,有空地,用” . "表示。空地上可以放兵,每个兵可以攻击他的上下左右四条直线范围(不能穿墙)
问在防止互相误伤的前提(任何一个兵不在其他兵射程之内),最多摆放多少个兵。
Input
第一行给出一个数字n
以下n行是NN的地图(0<=n<=8)
Output
对应每组数据最多能放多少兵,每组数据占一行。
Sample Input
4
.X…
…
XX…
…
Sample Output
5
#include<bits/stdc++.h>
using namespace std;
int ans,lon;
char ch[15][15];//cmp
bool check(int x,int y)
{
for (int i=y;i<=lon;i++)
{
if (ch[x][i]=='X')
break;
if (ch[x][i]=='D')
return false;
}
for (int i=y;i>=1;i--)
{
if (ch[x][i]=='X')
break;
if (ch[x][i]=='D')
return false;
}
for (int i=x;i>=1;i--)
{
if (ch[i][y]=='X')
break;
if (ch[i][y]=='D')
return false;
}
for (int i=x;i<=lon;i++)
{
if (ch[i][y]=='X')
break;
if (ch[i][y]=='D')
return false;
}
return true;
}
void find(int num,int x,int y)
{
if (num>ans)
ans=num;
for (int i=x;i<=lon;i++)
for (int j=1;j<=lon;j++)
if (check(i,j) && ch[i][j]=='.')//扩展方式所达到状态合法
{
ch[i][j]='D';//根据题意来添加
//标记;
find(num+1,i,j);// dfs();
ch[i][j]='.';
//是否还原标记根据题意
//如果加上(还原标记)就是 回溯法
}
}
int main()
{
cin>>lon;
for (int i=1;i<=lon;i++)
for (int j=1;j<=lon;j++)
cin>>ch[i][j];
find(0,1,1);
cout<<ans<<endl;
return 0;
}