题目链接:
http://poj.org/problem?id=3984
题目大意:
用一个5*5的二维数组表示迷宫,输出左上角到右下角的最短路径。
思路:
用BFS求最短路径。用pre[]来记录每个状态之前的状态,然后递归输出路径。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int Map[6][6],vis[6][6],pre[110]; //pre[]记录每个状态的前一个状态 struct Cam { int x,y; }List[110]; int Dire[4][2] = {-1,0,1,0,0,-1,0,1}; //上下左右四个方向 int Go(int x,int y) //判断是否可走 { if(x >= 0 && x < 5 && y >= 0 && y < 5 && Map[x][y] == 0) return 1; return 0; } void Print(int x) //输出路径 { int t; t = pre[x]; if(t == 0) { printf("(0, 0)\n"); printf("(%d, %d)\n",List[x].x,List[x].y); return ; } else Print(t); printf("(%d, %d)\n",List[x].x,List[x].y); } void BFS() { memset(vis,0,sizeof(vis)); int Head = 0,Tail = 1; List[0].x = 0; List[0].y = 0; pre[0] = -1; while(Head < Tail) //队列 { int x = List[Head].x; int y = List[Head].y; if(x == 4 && y == 4) { Print(Head); return ; } for(int i = 0; i < 4; ++i) { int xx = x + Dire[i][0]; int yy = y + Dire[i][1]; if( !vis[xx][yy] && Go(xx,yy) ) { vis[xx][yy] = 1; List[Tail].x = xx; List[Tail].y = yy; pre[Tail] = Head; Tail++; } } Head++; } return ; } int main() { for(int i = 0; i < 5; ++i) for(int j = 0; j < 5; ++j) scanf("%d",&Map[i][j]); BFS(); return 0; }
时间: 2024-11-12 04:26:51