A-Maze

题目:A-Maze

题目描述:东东有一张地图,想通过地图找到妹纸。地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0。既然已经知道了地图,那么东东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线。

输入:输入是一个5 × 5的二维数组,仅由0、1两数字组成,表示法阵地图。

输出:输出若干行,表示从左上角到右下角的最短路径依次经过的坐标,格式如样例所示。数据保证有唯一解。

注意:
坐标(x, y)表示第x行第y列,行、列的编号从0开始,且以左上角为原点。
另外注意,输出中分隔坐标的逗号后面应当有一个空格。

解题思路:典型的迷宫类题目,这里可以利用广度优先搜索加上记忆化解决(当然dfs也可以)。可以通过设置一个结构体,里面记录了该位置的上个位置,最后搜到目标之后,可以回溯返回路线。

代码:

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct node//要构建的结构体
{
    int x;
    int y;
    int pre;
    int now;
};
int d1[4]={0,1,-1,0},d2[4]={1,0,0,-1};
int a[5][5];
node h[25];
int main()
{
    int t;
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            cin>>a[i][j];
        }
    }
    h[0].x=0,h[0].y=0,h[0].pre=-1,h[0].now=0;
    queue<node> q;
    q.push(h[0]);//广搜开始
    int k=1;
    while(!q.empty())
    {
        node m=q.front();
        q.pop();
        int x=m.x,y=m.y,x1,y1,Now=m.now;
        if(x==4&&y==4)
        {
            t=Now;
            break;
        }
        for(int i=0;i<4;i++)
        {
                x1=x+d1[i],y1=y+d2[i];
                if(x1<0||y1<0||x1>4||y1>4)
                {
                    continue;
                }else if(a[x1][y1]==1)
                {
                    continue;
                }
                a[x1][y1]=1;
                h[k].x=x1,h[k].y=y1,h[k].now=k,h[k].pre=Now;//记录
                q.push(h[k]);
                k++;
        }
    }
    vector<node> f;//保存到vector中
    while(t!=-1)
    {
        f.push_back(h[t]);
        t=h[t].pre;
    }
    for(int i=f.size()-1;i>=0;i--)
    {
        cout<<"("<<f[i].x<<", "<<f[i].y<<")"<<endl;//输出
    }
}
发布了15 篇原创文章 · 获赞 0 · 访问量 234

猜你喜欢

转载自blog.csdn.net/qq_43653717/article/details/104634163
今日推荐