长沙理工大学第13届程序设计大赛 G.逃离迷宫

原创 2018年04月15日 19:53:29

题意:给你一个起点,一个终点,在地图中分布着一些钥匙,你需要先拿到钥匙,然后采取前往终点处,问需要通关多少步能完成任务。

题解:题目挺简单的,唯一坑点在于在没有找到钥匙之前,人是不能够穿过终点的,就相当于终点是障碍物。由于题目的要求,这就转化成了求2遍bfs,先从起点出发,搜索能够取到的钥匙,然后再从终点出发,搜索能够取到的钥匙。最后依次枚举所有的钥匙,如果存在正向和反向都能取到的钥匙,那就记录最小值就行啦。
还有最后很重要的一点,在多组输入的时候一定要记得清空vector又因为是这个原因找了1小时bug

下面是代码:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int, int>pii;
const int maxn = 505;
int dir[4][2] = {1, 0, 0, 1, 0, -1, -1, 0};
int d[2][maxn][maxn];
int t, n, m;
char S[maxn][maxn];
vector<pii>key;
pii beginpos, endpos;
void init() {
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            if(S[i][j] == 'P') beginpos = pii(i, j);
            else if(S[i][j] == 'E') endpos = pii(i, j);
            else if(S[i][j] == 'K') key.push_back(pii(i, j));
        }
    }
    memset(d, inf, sizeof(d));
}
void bfs(pii pos, int id) {
    queue<pii>q;
    q.push(pos);
    d[id][pos.first][pos.second] = 0;
    while(!q.empty()) {
        pos = q.front();
        q.pop();
        int x = pos.first;
        int y = pos.second;
        for(int k = 0; k < 4; k++) {
            int nx = x + dir[k][0];
            int ny = y + dir[k][1];
            if(nx < 1 || ny < 1 || nx > n || ny > m || S[nx][ny] == '#') continue;
            if(id == 0 && S[nx][ny] == 'E') continue;
            if(d[id][nx][ny] > d[id][x][y] + 1) {
                d[id][nx][ny] = d[id][x][y] + 1;
                q.push(pii(nx, ny));
            }
        }
    }
}
int solve() {
    key.clear();
    init();
    bfs(beginpos, 0);
    bfs(endpos, 1);
    int MIN = inf;
    for(int i = 0; i < key.size(); i++) {
        int x = key[i].first;
        int y = key[i].second;
        MIN = min(MIN, d[0][x][y] + d[1][x][y]);
    }
    return MIN;
}
int main() {
    scanf("%d", &t);
    while(t--) {
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; i++) scanf("%s", S[i] + 1);
        int ans = solve();
        if(ans == inf) {
            printf("No solution\n");
        } else {
            printf("%d\n", ans);
        }
    }
    return 0;
}
版权声明:希望能在自己成长的道路上帮到更多的人,欢迎各位评论交流 https://blog.csdn.net/yiqzq/article/details/79952364

最长子串(长沙理工大学第十一届程序设计竞赛 离线 做了n天.....崩溃了)

最长子串 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65535/65535K (Java/Other) Total Su...
  • su20145104009
  • su20145104009
  • 2016-04-26 17:03:15
  • 5078

浙江科技学院第十三届程序设计竞赛1008

A Heavy Rainy Day Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) ...
  • qq_28175337
  • qq_28175337
  • 2016-03-26 21:46:23
  • 462

第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 C-平分游戏

C - 平分游戏 思路:先看怎么处理一个圈有nnn个人只给相邻的人硬币的解法,保证总数整除nnn是必然的,有个很明显的情况就是如果AAA给了BBB,那么BBB将不会再给AAA,这样无疑是多余的步骤,...
  • hnust_Derker
  • hnust_Derker
  • 2018-03-25 10:56:51
  • 100

第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛(部分)

A 跳台阶 有一个n级台阶的楼梯,小明一次可以向上跳1步,两步,甚至是n步,请问小明跳到n级台阶有多少种跳法? 分析:第一眼想到1 2 和2 1 算两种还是一种,算2种,然后就暴搜了一下,找出...
  • feng_zhiyu
  • feng_zhiyu
  • 2018-03-25 10:58:28
  • 58

第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 K 密码

ZiZi登录各种账号的时候,总是会忘记密码,所以他把密码都记录在一个记事本上。其中第一个密码就是牛客网的密码。牛客网专注于程序员的学习、成长及职位发展,连接C端程序员及B端招聘方,通过IT笔试面试题库...
  • deepseazbw
  • deepseazbw
  • 2018-03-25 12:31:13
  • 52

第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 - (D,E,F,J)

链接:https://www.nowcoder.com/acm/contest/90#questionDpsd面试题意:每组给出一个字符,问忽略字母大小写,这个字符串去掉最长的回文子序列后还有多长?解...
  • sdau20163942
  • sdau20163942
  • 2018-03-24 21:15:26
  • 57

第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 L 用来作弊的药水 (唯一分解定理 和 哈希+快速幂)

在一个风雨交加的夜晚,来自异世界的不愿透露姓名的TMK同学获得了两种超强药水A、B。根据说明书,TMK知道了这两种药水的作用:    (1)药水A能使人的生命值提高,每饮用1个单位能使他生命值变成原来...
  • deepseazbw
  • deepseazbw
  • 2018-03-25 13:14:54
  • 39

第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛题目题解

点击查看比赛题目A-跳台阶#include &amp;lt;iostream&amp;gt; #include &amp;lt;stdio.h&amp;gt; using namespace std...
  • wyxeainn
  • wyxeainn
  • 2018-03-28 15:58:26
  • 61

第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 F 等式(数论,约数个数定理)

题目描述 给定n,求1/x + 1/y = 1/n (x&amp;lt;=y)的解数。(x、y、n均为正整数) 输入描述: 在第一行输入一个正整数T。 接下来有T行,每行输入一个正...
  • riba2534
  • riba2534
  • 2018-03-26 21:50:04
  • 31

第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛(A D F I J K L)

链接 :https://www.nowcoder.com/acm/contest/90#question A 跳台阶 类似斐波那契 #include &amp;lt;bits/stdc++....
  • qq_37493070
  • qq_37493070
  • 2018-03-24 22:44:16
  • 39
收藏助手
不良信息举报
您举报文章:长沙理工大学第13届程序设计大赛 G.逃离迷宫
举报原因:
原因补充:

(最多只允许输入30个字)