H - 迷宫问题

【题意】走迷宫问题,找最短路径的每一条路,bfs里面很经典的题

【思路】通过bfs搜索方法,对每一条最短路径都进行存取在数组中;

不过在存取过程中有一个技巧:用数组来存取每个迷宫上的二维点;采用递归的方式把所有点输出来;

【注意】不要搞混淆了,可以自己画图实验几个

以下就是我的代码:

#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
bool vis[5][5];
char  mp[5][5];
int fx[4]={-1,0,1,0};
int fy[4]={0,1,0,-1};
struct mk{
    int x,y;
}s[5][5];//用数组存取各个点
bool check(int x,int y)
{
    if(mp[x][y]=='0'&&x>=0&&x<5&&y>=0&&y<5)//判断边界条件
    {
        return 1;
    }
    return 0;
}
void fun(int x,int y)//答案的递归
{
    if(x==0&&y==0) return ;
    fun(s[x][y].x,s[x][y].y);//与真实二维坐标不一样哦
    cout<<"("<<s[x][y].x<<", "<<s[x][y].y<<")"<<"\n";
    return ;
}
void bfs(int x,int y)
{
    queue<mk> q;
    q.push({x,y});
    while(q.size())
    {
        mk now=q.front();
        q.pop();
        if(now.x==4&&now.y==4){//这时候说明已经到达目标
            fun(4,4); return ;
        }
        for(int i=0;i<4;i++)
        {
            int nextx=now.x+fx[i];
            int nexty=now.y+fy[i];
            if(!vis[nextx][nexty]&&check(nextx,nexty))
               {vis[nextx][nexty]=1;
                   s[nextx][nexty].x=now.x;
                   s[nextx][nexty].y=now.y;
                   q.push({nextx,nexty});
               }
        }
        
    }
    
    return ;
}

int main()
{

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    //memset(vis,0,sizeof(vis));
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            cin>>mp[i][j];
        }        
    }
    bfs(0,0);
    cout<<"(4, 4)"<<"\n";//因为最终没有记录该点
    
    
}
View Code

这道题最重要的就是理解数组的存取问题了,就是输出的fun函数,这道题是大佬讲解后才清楚的原因,不过还好解决啦。代码中也许还有些小错误,欢迎提出!!

当然,在后面做搜索题时,发现也不一定全是和你说清楚了的dfs或者bfs.要勤加练习。

猜你喜欢

转载自www.cnblogs.com/WGD943/p/12230011.html
今日推荐