迷宫问题
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 20442 | Accepted: 11962 |
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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)
http://poj.org/problem?id=3984
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int maze[6][6];
int go[6][6];
const int X[4]={1,-1,0,0};
const int Y[4]={0,0,1,-1};
typedef struct{
int x;
int y;
}Node;
queue<Node> q;
int vis[6][6];
int pre[6][6];
void print(int x,int y){
int t=pre[x][y];
switch(t){
case 0:print(x-1,y);
break;
case 1:print(x+1,y);
break;
case 2:print(x,y-1);
break;
case 3:print(x,y+1);
break;
default:
break;
}
cout<<"("<<x-1<<", "<<y-1<<")"<<endl;
}
void bfs(){
Node n;
n.x=1;n.y=1;
q.push(n);
vis[1][1]=1;
while(!q.empty()){
Node n1=q.front();
q.pop();
if(n1.x==5&&n1.y==5){
print(5,5);
return;
}
else{
for(int i=0;i<4;i++){
int x2,y2;
x2=n1.x+X[i];
y2=n1.y+Y[i];
if(x2<1||x2>5||y2<1||y2>5)
continue;
else{
if(!vis[x2][y2]&&!maze[x2][y2]){
vis[x2][y2]=1;
Node n2;
n2.x=x2;n2.y=y2;
pre[x2][y2]=i;
q.push(n2);
}
}
}
}
}
}
int main(){
memset(pre,-1,sizeof(pre));
memset(vis,0,sizeof(vis));
while(!q.empty()) q.pop();
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
cin>>maze[i][j];
bfs();
return 0;
}