zoukankan      html  css  js  c++  java
  • 岛屿问题求最短路径(DFS)

    用1代表陆地,用0代表陆地,你可以上下左右移动,给出下面这张地图求出最短路径

    01011
    00001
    10100
    10101
    10000

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int arr[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };
    int start_x, start_y, end_x, end_y;
    int MIN = 99999, step = 0;
    int map[5][5] = {
    0, 1, 0, 1, 1,
    0, 0, 0, 0, 1,
    1, 0, 1, 0, 0,
    1, 0, 1, 0, 1,
    1, 0, 0, 0, 0
    };
    
    void DFS(int x, int y, int step) {
        if (x == end_x && y == end_y) {//函数结束条件:到达目标点
            MIN = min(MIN, step);
            return;
        }
        for (int i = 0; i < 4; ++i) {
            int nx = arr[i][0] + x;
            int ny = arr[i][1] + y;//移动位置
            if (nx >= 5 || nx < 0 || ny >= 5 || ny < 0 || map[nx][ny] == 1) {//如果移动到边界外或者碰到墙,则重新选择方向走
                continue;
            }
            map[x][y] = 1;//标记刚刚呆的地方为1,不需要回去了
            DFS(nx, ny, step + 1);//以新的地方再次搜索
            map[nx][ny] = 0;//当回退时,说明找到了"终点",将改点设置可行,返回上个节点,找寻从上一个点有没有其他的路到终点
        }
    }
    
    int main()
    {
        cin >> start_x >> start_y >> end_x >> end_y;//输入起点和终点
        DFS(start_x, start_y, 0);
        cout << MIN;
        system("PAUSE");
        return 0;
    }

    类似的下面这种也仅仅是上面的符号变换。

    #S######.#
    ......#..#
    .#.##.##.#
    .#........
    ##.##.####
    ....#....#
    .#######.#
    ....#.....
    .####.###.
    ....#...G#

    “#”代表海洋,“.”代表陆地,S代表起点,G代表终点。
    这道的起点和终点坐标需要我们去查找,只要在输入时检测是否为起点或者终点,记录下坐标即可。

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    #define MAX_SIZE 50
    
    using namespace std;
    
    vector<vector<char> > map(MAX_SIZE, vector<char>(MAX_SIZE, '.'));
    int arr[4][2]{ 1, 0, -1, 0, 0, 1, 0, -1 };
    int MIN = 99999, begin_x, end_x, begin_y, end_y, a, b;
    
    void DFS(int x, int y, int step) {
        if (x == end_x && y == end_y) {
            MIN = min(MIN, step);
            return;
        }
    
        for (int i = 0; i < 4; i++) {
            int nx = x + arr[i][0];
            int ny = y + arr[i][1];
    
            if (nx < 0 || nx >= a || ny < 0 || ny >= b || map[nx][ny] == '#') {
                continue;
            }
            map[nx][ny] = '#';
            DFS(nx, ny, step + 1);
            map[nx][ny] = '.';
        }
    }
    
    int main()
    {
        int m, n;
        cin >> m >> n;
        a = m, b = n;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                cin >> map[i][j];
                if (map[i][j] == 'S') {
                    begin_x = i, begin_y = j;
                }
                if (map[i][j] == 'G') {
                    end_x = i, end_y = j;
                }
            }
        }
    
        DFS(begin_x, begin_y, 0);
    
        cout << MIN;
    
        return 0;
    }

    上面的这两种方式,利用递归将所有到达目的地的路线都找了出来,取最小值。

  • 相关阅读:
    静态包含与动态包含
    REST风格下如何放行静态资源
    java迭代器
    es6之扩展运算符 三个点(...)
    关于Echarts配置项的工作记录
    vscode中vue代码格式化的相关配置
    v-loading
    git中Please enter a commit message to explain why this merge is necessary.
    slot
    slot的使用方法
  • 原文地址:https://www.cnblogs.com/Mayfly-nymph/p/10629390.html
Copyright © 2011-2022 走看看