POJ 3984 迷宫问题

http://poj.org/problem?id=3984
迷宫问题
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 9158 Accepted: 5416

Description

定义一个二维数组: 

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)

Source

BFS 记录路径
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>
#include <stack>
#define maxn 10000+5
#define ull unsigned long long
#define ll long long
#define reP(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define cle(a) memset(a,0,sizeof(a))
#define mod 90001
#define PI 3.141592657
#define INF 1<<30
const ull inf = 1LL << 61;
const double eps=1e-5;

using namespace std;
struct node
{
int x,y;
};
bool cmp(int a,int b)
{
return a>b;
}
int mp[6][6];
int dir[4][2]={1,0,0,1,0,-1,-1,0};
queue<node>q;
node pre[30][30];
node p[30];
int vis[30][30];
void bfs()
{
cle(vis);
int k=0;
node u;
u.x=1,u.y=1;
vis[1][1]=1;
q.push(u);
while(!q.empty())
{
u=q.front(),q.pop();
if(u.x==5&&u.y==5)
{
int k=1;
while(1)
{
u=pre[u.x][u.y];
if(u.x==0&&u.y==0)break;
p[k++]=u;
}
//printf("(%d,%d)\n",0,0);
for(int i=k-1;i>=1;i--)
printf("(%d, %d)\n",p[i].x-1,p[i].y-1);
printf("(%d, %d)\n",4,4);
}
for(int i=0;i<4;i++)
{
node v;
v.x=u.x+dir[i][0];
v.y=u.y+dir[i][1];
if(!vis[v.x][v.y]&&v.x>=1&&v.x<=5&&v.y>=1&&v.y<=5&&mp[v.x][v.y]!=1)
{
vis[v.x][v.y]=1;
pre[v.x][v.y]=u;
q.push(v);
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
//freopen("out.txt","w",stdout);
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
{
scanf("%d",&mp[i][j]);
}
bfs();
return 0;
}

你可能感兴趣的:(POJ 3984 迷宫问题)