美文网首页
迷宫问题

迷宫问题

作者: 刘小小gogo | 来源:发表于2018-08-27 20:07 被阅读0次
image.png
image.png
image.png
image.png

几个知识点:

  1. pair<int,int>用 make_pair(0,0)
  2. dfs探索之后要记得还原
  3. int** maze的设置
  4. 一定要当心全局变量,在每一个运行中重置一下,minsize
    解法一:DFS
//
// Created by ljs on 2018/8/27.
//
#include <iostream>
#include <vector>
using namespace std;
vector<pair<int, int>> res;
int minsize = 200;
int m, n;
int dir[4][4] = {{-1, 0}, {0, 1},{1, 0}, {0, -1}};
void search(int x, int y, int m , int n, vector<pair<int, int>>& path, int** maze){
    if(x == m - 1 && y == n - 1 ){
        if(path.size() < minsize){
            res = path;
            minsize = res.size();
        }
        return;
    }
    else{
        for(int i = 0; i < 4; i++){
            int xx = x + dir[i][0];
            int yy = y + dir[i][1];
            if(xx < 0 || xx >= m || yy < 0 || yy >= n || maze[xx][yy] == 1)
                continue;
            maze[xx][yy] = 1;
            path.push_back(make_pair(xx,yy));//make_pair的使用
            search(xx, yy, m, n, path, maze);
            path.pop_back(); //一定要还原
            maze[xx][yy] = 0;//还原

        }
    }
}
int main(){


    while(cin>>m>>n){
        minsize = 200;//一定要重新更新
        int **maze = new int*[m];
        for(int i = 0; i < m; i++)
            maze[i] = new int[n];//学会此种定义方式
        for(int i = 0; i < m; i++){
            for(int j = 0 ; j < n; j++){
                cin>>maze[i][j];
            }
        }
        vector<pair<int, int>> path;
        path.push_back(make_pair(0,0));
        search(0, 0, m, n, path, maze);
        for(int i = 0 ; i < res.size(); i++){
            cout<<"("<<res[i].first<<","<<res[i].second<<")"<<endl;//对pair,用first和second
        }
    }
    return 0;
}

解法二:BFS
注意:全全局变量的默认初始化为0;
但是main中的初始化是随机数,所以要初始化!!!!
注意结构体的写法;

//
// Created by ljs on 2018/8/27.
//
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int m, n;
int dir[4][4] = {{-1, 0}, {0, 1},{1, 0}, {0, -1}};
struct node{
    int r;
    int c;
};
void print_path(node u, int d[10][10], node father[10][10]){
    vector<node> nodes;
    while(1){
        nodes.push_back(u);
        if(d[u.r][u.c] == 0)
            break;
        u = father[u.r][u.c];
    }
    for(int i = nodes.size() - 1; i >= 0 ;i-- ){
        cout<<"("<<nodes[i].r<<","<<nodes[i].c<<")"<<endl;
    }

}
void bfs(int visited[10][10], int maze[10][10], int d[10][10],node father[10][10]){
    queue<node> q;
    d[0][0] = 0;
    node zero;
    zero.r = 0;
    zero.c = 0;
    q.push(zero);
    visited[0][0] = 1;
    while(!q.empty()){
//        cout<<"qqq"<<endl;
        node cur = q.front();
        q.pop();
        int level = d[cur.r][cur.c];
//        cout<<cur.r<<cur.c<<endl;
        if(cur.r == m - 1 && cur.c == n-1){
            print_path(cur,d,father);
            return;
        }
        else{
            for(int i = 0; i < 4; i++){
                int xx = cur.r + dir[i][0];
                int yy = cur.c + dir[i][1];
                if(xx > m-1 || xx < 0 || yy > n-1 || yy < 0 || visited[xx][yy] == 1 || maze[xx][yy] ==  1){

//                    cout<<"continue"<<endl;
                    continue;
                }
                node tmp;
                tmp.r = xx;
                tmp.c = yy;
                q.push(tmp);
                //cout<<"push"<<endl;
                visited[xx][yy] = 1;
                father[xx][yy] = cur;
                d[xx][yy] = level + 1;
            }
        }
    }
}
int main(){
    while(cin>>m>>n){
        int maze[10][10];
//        cout<<"hhhh"<<endl;
        queue<node> q;
        for(int i = 0; i < m; i++){
            for(int j = 0 ; j < n; j++){
                cin>>maze[i][j];
            }
        }
        node father[10][10];
        int visted[10][10];
        for(int i = 0; i < 10; i++){
            for(int j = 0 ; j < 10; j++){
                visted[i][j] = 0;
            }
        }
        vector<node> nodes;
        int d[10][10];
//        cout<<"kkkkkkk"<<endl;
        bfs(visted, maze, d, father);

    }
    return 0;
}

相关文章

  • 迷宫问题

    几个知识点: pair 用 make_pair(0,0) dfs探索之后要记得还原 int** maze的设置 一...

  • 迷宫问题

    1. 问题描述 有一个char[m][n]二维矩阵表示迷宫,其中'1'代表此位置为畅通,'0'代表此位置为障碍,小...

  • 迷宫问题

    深度优先遍历走迷宫 广度优先遍历走迷宫 代码见github

  • 迷宫问题

    method1 递归求解 method2 队列法 method3 栈和回溯法 有错误

  • 深度优先搜索

    全排列问题。 迷宫问题。

  • 迷宫问题求解

    一、目的 1、进一步理解和掌握各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法。 2、掌握分析问题,求解问题...

  • 回溯迷宫问题

    给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然...

  • 算法-迷宫问题(递归)

    迷宫问题:之前只用栈来实现,现在使用递归来实现。blog.csdn.net/feixiaoxing/article...

  • 递归解迷宫问题

    递归程序需要向退出条件逼近,否则就会形成死递归 递归在方法结束或者遇到return时返回给调用者 使用递归解迷宫问...

  • 递归之迷宫问题

    1.什么是递归?简单来说,递归就是自己调用自己,每次调用自己都会创建新的栈帧。 2.什么是迷宫问题 任意位置的小球...

网友评论

      本文标题:迷宫问题

      本文链接:https://www.haomeiwen.com/subject/dxstwftx.html