迷宫问题

迷宫问题

链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1255


时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

定义一个二维数组:

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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

 

【输入】

一个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

【输出样例】

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue <int> Q;
int a[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int mp[6][6];
int j[6][6][2];
int bfs()
{
    int flag=0;
    while(!Q.empty())
    {
        if(flag)return 0;
        int x=Q.front();Q.pop();
        int y=Q.front();Q.pop();
        for(int i=0;i<4;i++)
        {
            int x1=x+a[i][0],yy1=y+a[i][1];
            if(x1>0&&x1<6&&yy1>0&&yy1<6&&!mp[x1][yy1])
            {
                mp[x1][yy1]=mp[x][y]+1;
                j[x1][yy1][0]=x;j[x1][yy1][1]=y;
                if(x1==5&&yy1==5){
                    flag=1;break;
                }
                Q.push(x1);Q.push(yy1);
            }
        }
    }
}
int show(int x,int y)
{
    if(x==1&&y==1)return 0;
    show(j[x][y][0],j[x][y][1]);
    printf("(%d, %d)
",j[x][y][0]-1,j[x][y][1]-1);
        
}
int main()
{
    for(int i=1;i<6;i++)
        for(int j=1;j<6;j++)
            {
                cin>>mp[i][j];
                if(mp[i][j])mp[i][j]=-1;
            }
    Q.push(1);Q.push(1);
    mp[1][1]=1;
    bfs();
    
    show(5,5);
    printf("(4, 4)
");
}
原文地址:https://www.cnblogs.com/EdSheeran/p/7631935.html