迷宫问题(POJ-3984)

迷宫问题

题目描述:
定义一个二维数组:

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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
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)

思路:
灵活掌握深度与广度优先搜索。0表示没走过的路,1表示走过的路和墙。走过就把0换成1,代表不能再走了。
AC代码:

#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
int dir[4][2] = { {1,0},  {-1,0}, {0,-1}, {0,1}};   //上下左右移动,四个方位
int num[5][5];  //储存数据
struct node
{
    int x, y;
}v[5][5];   //结构体数组(x,y)坐标
void DFS(int x, int y)  //深度优先搜索
{
    if(x == 0 && y ==0) //如果是起点(0,0)
    {
        return;
    }
    DFS(v[x][y].x, v[x][y].y);  //递归
    printf("(%d, %d)\n",v[x][y].x, v[x][y].y);  //打印坐标
}
void BFS(node s)    //广度优先搜索(s为坐标(结构体型变量))
{
    node t, q;      //定义两个结构体变量
    queue<node>Q;   //定义一个队列,用队列存数据
    Q.push(s);      //入队(把坐标存入队列)
    while(Q.size()) //如果队列不为空
    {
        q = Q.front();  //队首元素赋给q
        Q.pop();        //出列
        if(q.x == 4 && q.y == 4)    //坐标为终点
        {

            DFS(q.x, q.y);  //开始尝试下一个点
            printf("(%d, %d)\n",q.x,q.y);   //打印终点坐标
            return;
        }
        for(int i = 0; i<4; i++)
        {
            t = q;              //关键之笔,让同一个位置走四次不同的方向
            //计算下一点的坐标
            t.x += dir[i][0];
            t.y += dir[i][1];
            if(t.x >=0 && t.y >=0 && t.x <5 && t.y <5  && num[t.x][t.y] == 0)//判断是否越界,都在[5][5]之内,
            {                                                                //且不能是走过的路或者是墙。

                v[t.x][t.y].x = q.x;
                v[t.x][t.y].y = q.y;
                num[t.x][t.y] = 1;  //把走过的都变成墙(把0变成1)
                Q.push(t);  //入列
            }
        }
    }
}
int main(void)
{
    for(int i = 0; i<5; i++)
    {
        for(int j = 0; j<5; j++)
        {
            scanf("%d",&num[i][j]); //输入二维数组地图
        }
    }
    memset(v, 0, sizeof(v)); //清空数组
    node s; //定义一个结构体型的变量

    //初始化(x,y),坐标从(0,0)开始
    s.x = 0;
    s.y = 0;
    BFS(s); //调用BFS函数
    return 0;
}
发布了33 篇原创文章 · 获赞 35 · 访问量 1289

猜你喜欢

转载自blog.csdn.net/qq_45856289/article/details/103434035