H - 迷宫问题
Posted wgd943
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<<")"<<" "; 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)"<<" ";//因为最终没有记录该点 }
这道题最重要的就是理解数组的存取问题了,就是输出的fun函数,这道题是大佬讲解后才清楚的原因,不过还好解决啦。代码中也许还有些小错误,欢迎提出!!
当然,在后面做搜索题时,发现也不一定全是和你说清楚了的dfs或者bfs.要勤加练习。
以上是关于H - 迷宫问题的主要内容,如果未能解决你的问题,请参考以下文章