BFS PKU3984
来源:互联网 发布:华为ar 限制 mac 编辑:程序博客网 时间:2024/05/29 10:29
题目已经说了有唯一的解,所以只需要在找的过程中保存当前这个点前面的那个的点在队列中的位置
然后再输出的时候运用递归输出就可以了。
迷宫问题
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 8238 Accepted: 4848
Description
定义一个二维数组:
它表示一个迷宫,其中的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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0
Sample Output
(0, 0)(1, 0)(2, 0)(2, 1)(2, 2)(2, 3)(2, 4)(3, 4)(4, 4)
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <limits.h>#include <ctype.h>#include <string.h>#include <string>#include <queue>#include <math.h>#include <algorithm>#include <iostream>#include <stack>#include <deque>#include <vector>#include <set>using namespace std;#define MAXN 10int xx[4]={-1,0,1,0};int yy[4]={0,1,0,-1};int vis[MAXN][MAXN];int map[MAXN][MAXN];int ans;struct node{ int x,y; int pre;}q[111];int start=0;int end = 1;void print(int x){ if(q[x].pre != -1){ print(q[x].pre); printf("(%d, %d)\n",q[x].x,q[x].y); }}void BFS(int x,int y){ int i; vis[x][y] = 1; q[start].x = x; q[start].y = y; q[start].pre = -1; while(start < end){ if(q[start].x==4 && q[start].y==4){ print(start); } for(i=0;i<4;i++){ int dx = xx[i] + q[start].x; int dy = yy[i] + q[start].y; if(dx>=0 && dx<5 && dy>=0 && dy<5 && vis[dx][dy]==0 && map[dx][dy]==0){ q[end].x = dx; q[end].y = dy; vis[dx][dy] = 1; q[end].pre = start; end++; } //if(dx==4 && dy==4){ // print(start); //} } start++; }}int main(){ int i,j; for(i=0;i<5;i++){ for(j=0;j<5;j++){ cin>>map[i][j]; } } memset(vis,0,sizeof(vis)); printf("(0, 0)\n"); BFS(0,0); //printf("(4, 4)\n"); return 0;}
0 0