POJ 3984 迷宫问题 手写队列+BFS路径输出

来源:互联网 发布:建筑图纸设计软件 编辑:程序博客网 时间:2024/05/17 23:07

POJ 3984 迷宫问题 手写队列+BFS路径输出

传送门

定义一个二维数组:

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)

中文题面,不解释。不得不吐槽下这个题目的数据弱的吓死人。尽然只有一组样例的数据。样例对了,就能a,但是要想一下,实际地应该怎么写呢; 因为要输出路径,所以要递归输出坐标,嗯,对 还有手写队列。注意队列[l,r),是左闭右开的,入队就是r++,出队就是l++;

#include<iostream>#include<queue>#include<cstring>#include<cstdio>using namespace std;struct node{    int x,y;    int pre;}q[105];int dir[4][2]={1,0,0,-1,-1,0,0,1};int mp[10][10];int l=0,r=1;void print(int f){    if(q[f].pre!=-1)        print(q[f].pre);    printf("(%d, %d)\n",q[f].x,q[f].y);}void bfs(){    q[l].x = 0;    q[l].pre = -1;    q[l].y = 0;    while(l<r){        for(int i=0;i<4;i++){            int xx = q[l].x+dir[i][0];            int yy = q[l].y+dir[i][1];            if(xx<0||yy<0||xx>=5||yy>=5||mp[xx][yy])                continue;            else {                mp[xx][yy] = 1;                q[r].x = xx;                q[r].y = yy;                q[r].pre = l;                r++;            }            if(xx==4&&yy==4){                print(l);                return ;            }        }        l++;    }}int main(){    for(int i = 0 ;i<5;i++){        for(int j = 0 ;j<5;j++){            cin>>mp[i][j];        }    }    bfs();    printf("(4, 4)\n");    return 0;}
原创粉丝点击