2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 A:建图跑SPFA

本文介绍了一种解决游戏地图中寻找从当前位置到安全区域最安全路径的问题,通过使用SPFA算法进行路径规划,以最小化遇到敌人的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接: https://www.nowcoder.com/acm/contest/118/A
来源:牛客网

最近,喜爱ACM的PBY同学沉迷吃鸡,无法自拔,于是又来到了熟悉的ERANGEL。经过一番搜寻,PBY同学准备动身前往安全区,但是,地图中埋伏了许多LYB,PBY的枪法很差,希望你能够帮他找到一条路线,每次只能向上、下、左、右移动,尽可能遇到较少的敌人。

输入描述:

题目包含多组测试,请处理到文件结束;
第一行是一个整数n,代表地图的大小;
接下来的n行中,每行包含n个整数a,每个数字a代表当前位置敌人的数量;
1 < n <= 100,1 <= a <= 100,-1代表当前位置,-2代表安全区。

输出描述:

对于每组测试数据,请输出从当前位置到安全区所遇到最少的敌人数量,每个输出占一行。

#include <bits/stdc++.h>

using namespace std;
const int maxn = 10010;
int n, st, ed;
bool inq[maxn];
int a[107][107];
int d[maxn];
const int dirx[] = {0,0,1,-1};
const int diry[] = {1,-1,0,0};

vector<pair<int, int> > G[maxn];
bool inside(int i, int j)
{
    return i >= 1 && j >= 1 && i <= n && j <= n;
}

struct cmp
{
    bool operator () (int &t1, int &t2) const {
        return d[t1] > d[t2];
    }
};
void spfa()
{
    d[st] = 0;
    priority_queue<int, vector<int>, cmp> que;
    que.push(st);
    inq[st] = 1;
    while(!que.empty()) {
        int u = que.top(); que.pop();
        inq[u] = 0;
        for(int i = 0;i < G[u].size();i ++) {
            int v = G[u][i].first;
            int w = G[u][i].second;
            if(d[v] > d[u] + w) {
                d[v] = d[u] + w;
                if(!inq[v]) {
                    que.push(v);
                    inq[v] = 1;
                }
            }
        }
    }
}

int main()
{
    while(~scanf("%d", &n)) {
        memset(d, 0x3f, sizeof(d));
        for(int i = 1; i <= n; i ++) {
            for(int j = 1; j <= n; j ++) {
                scanf("%d", &a[i][j]);
                if(a[i][j] == -1) st = (i - 1) * n + j;
                if(a[i][j] == -2) ed = (i - 1) * n + j;
            }
        }
        for(int i = 1; i <= n; i ++) {
            for(int j = 1; j <= n; j ++) {
                int now = (i - 1) * n + j;
                G[now].clear();
                for(int k = 0;k < 4;k ++) {
                    int di = i + dirx[k];
                    int dj = j + diry[k];
                    if(inside(di, dj)) {
                        int p = (di - 1) * n + dj;
                        if(a[di][dj] < 0) G[now].push_back(make_pair(p, 0));
                        else G[now].push_back(make_pair(p, a[di][dj]));
                    }
                }
            }
        }
        spfa();
        printf("%d\n", d[ed]);
    }
    return 0;
}

绝地求生:易语言 全套加速器源码【更新日期:20181月10日】 使用说明: 用FTP将后台文件用二进制上传到网站根目录后安装网站 安装好后登陆后台添加产品 然后把激活码输入都源码里,产品ID,通信秘钥在后台添加产品后获取,并输入 然后搜索HTTP 把所有HTTP网址改成自己的域名即可 后台设置公告(重要)不设置会导致软件无法启动 格式为 公告内容||网址 添加游戏: 在M文件夹中 route就是存放游戏路由表的地方 打开 1||英雄联盟||http://域名/m/route/yxlm.txt||http://域名/m/route/1.png||0 序号||游戏名称||游戏路由表地址||游戏LOGO地址||后面的0代表国内游戏,1则为国外游戏 路由表格式参考:add 1.207.140.0 mask 255.255.255.0 IP METRIC default IF IFZ add 14.17.12.0 mask 255.255.255.0 IP METRIC default IF IFZ add 14.17.13.0 mask 255.255.255.0 IP METRIC default IF IFZ add 14.17.14.0 mask 255.255.255.0 IP METRIC default IF IFZ 线路添加:网游加速的线路分别存放在这两个文件里面 国内跟国外,格式为 线路名称||IP||用户名||密码 网络加速则存放在 编写好节点文档后,采用附赠的加密工具加密后上传到网站根目录即可 充值系统 注:后台必须把充值卡位数改成10位以内,太多字符会导致充值出错! 1.首先打开注册个账号http://www.1ka123.com/dashboard/index 2.打开雷盾的后台 获取客户ID 3.地址 高级=》在线售卡 4. 这里写上客户ID 然后点编辑 刷新 5.获取提卡数据 6.在易卡上面 找到商品/分类的商品列表 点编辑 7.平台对接写雷盾 对接密匙 写提卡数据 然后点保存这样子就可以实现无卡的时候自动补卡了 软件对接: 打开源码目录下的扫码支付模块 按下列格式写入你的卡类信息 比如我这里增加月卡 修改完即可收款实现自动充值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值