POJ 【3984】 迷宫问题

来源:互联网 发布:淘宝内衣模特摄影 编辑:程序博客网 时间:2024/06/05 01:59
迷宫问题
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 13874 Accepted: 8284

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 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)

Source


#include <cstdio>#include <cstring>#include <iostream>#include <queue>#include <stack>using namespace std;const int maxn = 10;int maze[maxn][maxn];int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};struct Node{    int x,y;}fa[maxn][maxn];void bfs(){    queue <Node> que;    while(!que.empty()) que.pop();    Node pre,cur;    pre.x = 0;    pre.y = 0;    que.push(pre);    maze[0][0] = 1;    while(!que.empty())    {        pre = que.front();        que.pop();        if(pre.x == 4 && pre.y == 4)            return;        for(int i = 0; i < 4; i++)        {            int x = pre.x + dir[i][0];            int y = pre.y + dir[i][1];            if(x < 0 || x >= 5 || y < 0 || y >= 5)                continue;            if(!maze[x][y])            {                maze[x][y] = 1;                fa[x][y].x = pre.x;                fa[x][y].y = pre.y;                cur.x = x;                cur.y = y;                que.push(cur);            }        }    }}int main(){    memset(fa,0,sizeof(fa));    memset(maze,0,sizeof(maze));    for(int i = 0; i < 5; i++)        for(int j = 0; j < 5; j++)            scanf("%d", &maze[i][j]);    bfs();    stack <Node> S;    Node node;    node.x = 4;    node.y = 4;    S.push(node);    while(node.x || node.y)    {        int x = node.x;        int y = node.y;        node.x = fa[x][y].x;        node.y = fa[x][y].y;        S.push(node);    }    while(!S.empty())    {        node = S.top();        printf("(%d, %d)\n", node.x, node.y);        S.pop();    }    return 0;}

0 0