zoukankan      html  css  js  c++  java
  • 迷宫问题(bfs的应用)

    问题描述:

    定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: 

    int maze[5][5] = {

            0, 1, 0, 0, 0,

            0, 1, 0, 1, 0,

            0, 0, 0, 0, 0,

            0, 1, 1, 1, 0,

            0, 0, 0, 1, 0,

    };

    它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。

    Input

    一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

    Output

    左上角到右下角的最短路径,格式如样例所示。

    Sample Input

    0 1 0 0 0

    0 1 0 1 0

    0 0 0 0 0

    0 1 1 1 0

    0 0 0 1 0

    Sample Output

    (0, 0)

    (1, 0)

    (2, 0)

    (2, 1)

    (2, 2)

    (2, 3)

    (2, 4)

    (3, 4)

    (4, 4)


    使用广度搜素,第一个找到出口的路径一定是最短路径。

    搜索过程中使用 point pre[][]数据记录上一坐标的位置,用来保存路径,这样就可以从pre[m][n]往回找寻路径,一直找到pre[0][0]。

    搜索过程中可以需要改变迷宫数组mn为第三种状态,以防止重复搜索。相当于一般用法中自己定义visited数组了。

    #include<iostream>
    #include<queue>
    #include<stack>
    using namespace std;
    //定义坐标
    struct point
    {
        int x;
        int y;
    };
    
    int mn[11][11];//记录迷宫状态:0可以访问,1不能访问,-1已经访问过
    point pre[11][11];//记录上一个访问的坐标
    point mov[4]={{-1,0},{0,-1},{0,1},{1,0}}; //表示坐标的移动方向
    
    bool bfs(int m,int n,int x,int y)
    {
        queue<point> zb;
        point temp;
        temp.x=x;
        temp.y=y;
        zb.push(temp);
        mn[x][y]=-1;
        while(!zb.empty())
        {
            point top;
            top=zb.front();
            zb.pop();
            for(int i=0;i<4;i++)
            {
                if(top.x+ mov[i].x==m-1 && top.y+mov[i].y==n-1)
                {
                    mn[top.x+ mov[i].x][top.y+mov[i].y]=-1;
                    pre[top.x+ mov[i].x][top.y+mov[i].y]=top;
                    return true;
                }
                if(mn[top.x+ mov[i].x][top.y+mov[i].y]==0)
                {
                    mn[top.x+ mov[i].x][top.y+mov[i].y]=-1;
                    pre[top.x+ mov[i].x][top.y+mov[i].y]=top;
                    point t;
                    t.x=top.x+ mov[i].x;
                    t.y=top.y+mov[i].y;
                    zb.push(t);
                }
            }
        }
        return false;
    }
    
    int main()
    {
        int m,n;
        cin>>m>>n;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>mn[i][j];
            }
        }
        stack<point>st;
        if(bfs(m,n,0,0))
        {
            point temp;
            temp.x=m-1;
            temp.y=n-1;
            while(!(temp.x==0 && temp.y==0) )
            {
                st.push(temp);
                temp=pre[temp.x][temp.y];
            }
            temp.x=0;
            temp.y=0;
            st.push(temp);
            while(!st.empty())
            {
                cout<<'('<<st.top().x<<','<<st.top().y<<')'<<endl;
                st.pop();
            }
        }
        return 0;
    }
  • 相关阅读:
    实现自我的互联网时代(2020时事与科技前沿思辨(博雅课)课程论文)
    学不会OO的第四单元反思
    学不会OO的第三单无反思(尽管刚才让JML爪8但是JUnit真的是个好东西
    学不会OO的第二单元反思
    学不会OO的第一单元反思
    2020北航面向对象第四单元总结
    2020北航面向对象第三单元总结
    2020北航面向对象第二单元总结
    2020北航面向对象第一单元总结
    提问回顾与个人总结
  • 原文地址:https://www.cnblogs.com/bewolf/p/4802244.html
Copyright © 2011-2022 走看看