题解-火力网

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

题解-火力网

Description
给你张NN的地图,地图上有墙,用"X"表示,有空地,用” . "表示。空地上可以放兵,每个兵可以攻击他的上下左右四条直线范围(不能穿墙)
问在防止互相误伤的前提(任何一个兵不在其他兵射程之内),最多摆放多少个兵。
Input
第一行给出一个数字n
以下n行是N
N的地图(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;   
}

猜你喜欢

转载自blog.csdn.net/Tangwan_jeff/article/details/95200548