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

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
#include
#include
#include
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(lfor(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;
}

你可能感兴趣的:(广度优先搜索)