本文主要是介绍HDU 3984 迷宫问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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)
题意就不用解释了;
思路:求最短路径直接bfs一下就可以了,但是题目中还要求将路径输出,所以我就用了结构体,结构体里边装的是一个节点的坐标还要存一下他的前驱(即上一个节点的标号),这样找到重点后回溯输出节点的坐标了
ac:代码
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; int cnx[4]={0,-1,0,1}; int cny[4]={1,0,-1,0}; bool vis[10][10]; int a[6][6]; struct node { int x;int y; int last; }que[100]; void print(int k) { int t=que[k].last; if(t==-1) {printf("(0, 0)\n"); return; } print(t); printf("(%d, %d)\n",que[k].x,que[k].y); } void bfs(int x,int y) { memset(vis,0,sizeof(vis)); int head=0; int tail=0; que[tail].x=x; que[tail].y=y; que[tail].last=-1; vis[x][y]=1; tail++; while(head<tail) { int m=que[head].x; int n=que[head].y; if(m==4&&n==4) { print(head); return; } for(int i=0;i<4;i++) { int m1=m+cnx[i]; int n1=n+cny[i]; if(m1<0||m1>4||n1<0||n1>4||vis[m1][n1]==1||a[m1][n1]==1) continue; que[tail].x=m1; que[tail].y=n1; que[tail].last=head; tail++; vis[m1][n1]=1; } head++; } } int main() { for(int i=0;i<5;i++) { for(int j=0;j<5;j++) { scanf("%d",&a[i][j]); } } bfs(0,0); return 0; }
这篇关于HDU 3984 迷宫问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!