您的位置:首页 > 其它

BFS-POJ-3984-迷宫问题

2015-08-09 16:29 543 查看
迷宫问题

Time Limit: 1000MS Memory Limit: 65536K

Total Submissions: 11333 Accepted: 6784

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)

水题,BFS保存路径即可。

//
//  main.cpp
//  简单搜索-K-迷宫问题
//
//  Created by 袁子涵 on 15/8/9.
//  Copyright (c) 2015年 袁子涵. All rights reserved.
//

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

bool maze[6][6];
bool visit[6][6];

typedef struct node
{
int x,y;
struct node *pre;
}Node;

typedef struct queue
{
int head,tail;
Node data[50];
}Queue;

Queue q;
Node final,out[50];

void init_queue()
{
q.head=0;
q.tail=0;
}

bool empty_queue()
{
if (q.head==q.tail) {
return 0;
}
return 1;
}

void bfs()
{
Node t;
q.data[0].x=0;
q.data[0].y=0;
visit[0][0]=1;
q.tail++;
while (empty_queue()) {
t=q.data[q.head];
//判断是否到终点
if (t.x==4 && t.y==4) {
final=q.data[q.head];
return;
}
//上下左右
if (t.x>0 && visit[t.x-1][t.y]==0 && maze[t.x-1][t.y]==0) {
q.data[q.tail].x=t.x-1;
q.data[q.tail].y=t.y;
q.data[q.tail].pre=&q.data[q.head];
q.tail++;
visit[t.x-1][t.y]=1;
}
if (t.x<4 && visit[t.x+1][t.y]==0 && maze[t.x+1][t.y]==0) {
q.data[q.tail].x=t.x+1;
q.data[q.tail].y=t.y;
q.data[q.tail].pre=&q.data[q.head];
q.tail++;
visit[t.x+1][t.y]=1;
}
if (t.y>0 && visit[t.x][t.y-1]==0 && maze[t.x][t.y-1]==0) {
q.data[q.tail].x=t.x;
q.data[q.tail].y=t.y-1;
q.data[q.tail].pre=&q.data[q.head];
q.tail++;
visit[t.x][t.y-1]=1;
}
if (t.y<4 && visit[t.x][t.y+1]==0 && maze[t.x][t.y+1]==0) {
q.data[q.tail].x=t.x;
q.data[q.tail].y=t.y+1;
q.data[q.tail].pre=&q.data[q.head];
q.tail++;
visit[t.x][t.y+1]=1;
}
q.head++;
}
}

int main(int argc, const char * argv[]) {
Node *p1,*p2;
for (int i=0; i<5; i++) {
for (int j=0; j<5; j++) {
cin >> maze[i][j];
}
}
bfs();
p1=&final;
int t=0;
while (p1!=NULL) {
p2=p1->pre;
out[t].x=p1->x;
out[t].y=p1->y;
t++;
p1=p2;
}
while (t--) {
printf("(%d, %d)\n",out[t].x,out[t].y);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: