zoukankan      html  css  js  c++  java
  • P1825 玉米田迷宫题解

    题目传送门

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int n, m;
    const int N = 310;
    //地图
    char a[N][N];
    int x, y; //Bessie的起始点
    //是不是访问过了
    int st[N][N];
    
    //放入队列的结构体
    struct node {
        int x, y, step;
    };
    queue<node> q; //队列
    
    int dx[] = {0, 0, -1, 1}; //左右上下
    int dy[] = {-1, 1, 0, 0};
    
    //找到相对点
    void getDui(int x, int y, int &x1, int &y1) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++)
                //注意不能与原点相同
                if (!(i == x && j == y) && a[i][j] == a[x][y]) x1 = i, y1 = j;
        }
    }
    
    void bfs() {
        /**
         被填充为玉米的格子用“#”表示,草地用“.”表示,每一对装置的结点由相同的大写字母组成“A-Z”,
         且没有两个不同装置的结点用同一个字母表示,出口用“=”表示。
         */
        st[x][y] = 1;            //Bessie的起始点要设置为已使用
        q.push({x, y, 0});//初始化队列
        //开始广度优先搜索
        while (!q.empty()) {
            node p = q.front();
            q.pop();
            //四个方向
            for (int i = 0; i < 4; i++) {
                //下一步的坐标
                int x1 = p.x + dx[i], y1 = p.y + dy[i];
    
                //如果下一跳是出口
                if (a[x1][y1] == '=') {
                    cout << p.step + 1 << endl;
                    return;
                }
                //每一对装置的结点由相同的大写字母组成“A-Z”
                if (a[x1][y1] >= 'A' && a[x1][y1] <= 'Z') {
                    //坐上直达飞行设备
                    //找对应的点
                    getDui(x1, y1, x, y);
                    x1 = x, y1 = y;
                }
                //草地用“.”表示,玉米用“#”表示
                if (x1 >= 1 && y1 >= 1 && a[x1][y1] != '#' && !st[x1][y1]) {
                    q.push({x1, y1, p.step + 1});
                    //标识走过了
                    st[x1][y1] = 1;
                }
            }
        }
    }
    
    int main() {
        //输入
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++) {
                cin >> a[i][j];
                if (a[i][j] == '@') x = i, y = j;//出发点
            }
    
        //广度优先搜索
        bfs();
        return 0;
    }
    
  • 相关阅读:
    iOS 版本更新迭代
    iOS 去掉导航栏最下面线的方法
    iOS AFNetWorking中block执行完后再执行其它操作
    iOS UICollectionViewCell 的拖动
    iOS 开发中有关pch文件,以及pch常用的内容
    iOS 中UIWebView的cookie
    iOS有关通讯录操作
    Eclipse 快捷键
    SublimeText
    正则表达式
  • 原文地址:https://www.cnblogs.com/littlehb/p/15070525.html
Copyright © 2011-2022 走看看