广搜之逃离迷宫

转载 2018年04月14日 22:26:34


#include <cstdio>
#include <queue>

using namespace std;
/*难在预处理子弹位置部分,不熟悉如何处理,需要多加思考多加练习。
*代码依然不是我敲的。
*/
struct node {
    int x, y, deep;
    node(int _x, int _y, int _deep) : x(_x), y(_y), deep(_deep) {}
};

const int kMax = 100 + 10;
const int dx[] = {-1, 1, 0, 0, 0};
const int dy[] = {0, 0, -1, 1, 0};

int n, m, k, d;
bool vis[kMax * 10][kMax][kMax];
queue<node> q;

int get_direction(char ch) {
    if(ch == 'N') return 0;
    if(ch == 'S') return 1;
    if(ch == 'W') return 2;
    return 3;
}

int solve() {
    while(!q.empty()) {
        node t = q.front(); q.pop();
        if(t.deep > d) return -1;//死了
        if(t.x == n && t.y == m) return t.deep;//逃出生天
        for(int i = 0;i < 5;++ i) {//尝试五个搜索出口
            int x = t.x + dx[i], y = t.y + dy[i];
            if(x >= 0 && x <= n && y >= 0 && y <= m &&
              !vis[t.deep + 1][x][y]) {
                q.push({x, y, t.deep + 1});
                vis[t.deep + 1][x][y] = true;
            }
        }
    }
    return -1;
}

int main() {
    char ch;
    int c, t, v, x, y;
    scanf("%d%d%d%d", &n, &m, &k, &d);//n+1行,m+1列,k个士兵,d个单位能量
    getchar();//吃掉回车符
    for(int i = 0;i < k;++ i) {
        scanf("%c%d%d%d%d", &ch, &t, &v, &x, &y);
        getchar();
        c = get_direction(ch);//方向转化
        for(int j = 0;j <= d;++ j) {//该点有士兵
            vis[j][x][y] = true;
        }
        for(int j = 0;j < d;j += t) {//预处理每个周期所打出的子弹的落点
            for(int a = 1;j + a <= d;++ a) {//计算每个子弹随时刻变化所在的地方
                int tx = x + dx[c] * a * v, ty = y + dy[c] * a * v;//计算坐标
                if(tx < 0 || tx > n || ty < 0 || ty > m) break;
                vis[j + a][tx][ty] = true;//记录时间及坐标
            }
        }
    }
    q.push({0, 0, 0});//起点
    vis[0][0][0] = true;
    int res = solve();
    if(res == -1) printf("Bad luck!\n");
    else printf("%d\n", res);
    return 0;
}

逃出迷宫完整算法C++

迷宫图案,白色代表通道,黑色代表墙。  迷宫入口坐标(1,1),出口坐标(8,8)   0 1 2 3 4 5 6 7 8 9   0■■■■■■■■■■   1■□□■□□□■□■   2■□□■□...
  • sinat_21903855
  • sinat_21903855
  • 2015-10-13 22:27:33
  • 360

广搜BFS 迷宫问题

广搜BFS 迷宫问题
  • yang_zongjun
  • yang_zongjun
  • 2014-09-06 19:03:59
  • 610

逃离迷宫(bfs)

题意:给出一个图和两个点的坐标,以及一个整数k,求从一个点是否能在k次拐弯内到达另一个点链接: http://acm.hdu.edu.cn/webcontest/contest_showproble...
  • qq_35399846
  • qq_35399846
  • 2016-07-28 09:50:30
  • 182

杭电 HDU ACM 1728 逃离迷宫

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • lsgqjh
  • lsgqjh
  • 2015-05-08 01:15:30
  • 1160

迷宫问题 (广搜+记录路径)

定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1...
  • qq_39091609
  • qq_39091609
  • 2017-07-25 16:51:39
  • 911

【搜索-广搜】 迷宫的最短路径

题目: 给定一个大小为N*M的迷宫,由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置。试求出起点到终点的最小步数。(本题假定迷宫是...
  • baidu_35643793
  • baidu_35643793
  • 2017-02-14 15:13:18
  • 993

hdu 杭电 1728 逃离迷宫

题意:m × n (m行, n列)的迷宫,给你两个坐标A(x1,y1),B(x2,y2),从A->B转过的最少弯数是否满足条件      满足输出“yes”,否输出“no”   解法:广搜, ...
  • u010827292
  • u010827292
  • 2016-03-17 10:37:33
  • 249

NOI 2.5基本算法之搜索 走出迷宫----广搜算法的实现

一、题目描述 总时间限制: 1000ms 内存限制: 65536kB 描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。  假...
  • C20180602_csq
  • C20180602_csq
  • 2016-08-26 16:29:22
  • 1330

广搜 基础 走迷宫 记录路径

#include #include #include #include #include #define N 5 using namespace std; const int dx[4] =...
  • DHBLOG
  • DHBLOG
  • 2014-07-16 16:41:27
  • 1109

POJ 3984 迷宫问题 广搜迷宫解法

本题是经典的迷宫搜索问题了,使用广搜比使用深搜效率要高。 思路关键点: 1 从终点出发查找起点,这样方便记录路径 2 每次查找到下一个空格,可走方格之后,可以马上标识该格为不可走了 3 找到起点之后,...
  • kenden23
  • kenden23
  • 2014-10-29 09:55:37
  • 2201
收藏助手
不良信息举报
您举报文章:广搜之逃离迷宫
举报原因:
原因补充:

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