BFS PKU3984
题目已经说了有唯一的解。所以仅仅须要在找的过程中保存当前这个点前面的那个的点在队列中的位置
然后再输出的时候运用递归输出就能够了。
迷宫问题
Time Limit: 1000MS | Memory Limit: 65536K | |
Total 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 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 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 10 int 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; }