Fire Net(深度优先遍历)

题目描述

假设我们有一个方形的城市,其街道都是直的。在方形地图上,有n行和n列,每个代表一条街道或一堵墙。每个碉堡有4个射击孔,分别正对东西南北方向。在每个射击孔配备一架高射机枪。
我们假设,子弹是如此强大,它的射程可以任意远,并能摧毁它所击中的碉堡。墙也是很坚固的,足以阻止子弹的摧毁。
问题的目标是,在该城市中布置尽可能多的碉堡,而碉堡之间又不会相互摧毁。合理布置碉堡的原则是,没有两个碉堡在同一个水平方向或垂直方向,除非它们之间有墙相隔。在本题中,假定城市很小(最多4×4),而且有子弹不能贯穿的墙壁。
在这里插入图片描述
在这里插入图片描述

代码

#include<bits/stdc++.h>
#define N 100
typedef long long ll;
using namespace std;
int cMap[5][5];//地图
int iBest;//最优解
int n;//地图的大小
//回溯算法,子集数
//判断在行row和列col处能否配置碉堡
bool CanPut(int row,int col)
{
    int i;
    //判断col列上的合法性
    for(i=row-1;i>=0;i--)
    {
        if(cMap[i][col]=='o')return false;
        if(cMap[i][col]=='X')break;
    }
    //判断row行上的合法性
    for(i=col-1;i>=0;i--)
    {
        if(cMap[row][i]=='o')return false;
        if(cMap[row][i]=='X')break;
    }
    return true;
}
void solve(int k,int current)
{
    int x,y;
    if(k==n*n)//整个地图判断完毕
    {
        //更新最优解
        if(current>iBest)
        {
            iBest=current;return;
        }
    }
    else
    {
        //将单元转化为x,y坐标
        x=k/n;
        y=k%n;
        if(cMap[x][y]='.'&&CanPut(x,y))//左子树
        {
            cMap[x][y]='o';//放置一个碉堡
            solve(k+1,current+1);
            cMap[x][y]='.';//恢复现场
        }
        solve(k+1,current);//不放置碉堡,右子树
    }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>cMap[i][j];
        }
    }
    solve(1,1);
    cout<<iBest;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值