题目链接:http://poj.org/problem?id=3984
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 34700 | Accepted: 19732 |
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)
思路:这道题真心不会,代码抄的,现贴上,后面自己摸索出一种方法(flag)! j第二个上映了,谢谢自己的努力,第一个我打算放弃了
【1】
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
const int maxn = 5;
//都不想多说,开个数组都能re
int vis[maxn][maxn];
int map1[maxn][maxn];
int dis[4][2] = {1,0,-1,0,0,1,0,-1};
struct node{
int x;
int y;
int cnt;
int step;
int l[15];
bool friend operator < (node a,node b)
{
return a.step > b.step;
}
}; //讲道理,我真没看出这个step有啥用,我觉得没用
bool check(int x,int y)
{
if(x>=0 && x<5 && y>=0 && y<5 && map1[x][y] == 0 && !vis[x][y])
return true;
return false;
}
//上面是进行判断。下面进行bfs调用
node bfs()
{
memset(vis,0,sizeof vis);
priority_queue<node>que;
node e1,e2;
e1.x = 0,e1.y = 0,e1.step = 0;
que.push(e1);
vis[e1.x][e1.y] = 0;
e1.cnt = 0;
while(!que.empty())
{
e1 = que.top();
que.pop();
if(e1.x == 4 && e1.y == 4)
return e1;
for(int i=0;i<4;i++)
{
e2 = e1;
e2.x = e1.x + dis[i][0];
e2.y = e1.y + dis[i][1];
e2.l[e2.cnt++] = i; //记录路径
if(check(e2.x,e2.y))
{
vis[e2.x][e2.y] = 1;
que.push(e2);
}
}
}
}
int main()
{
//走程序
ios::sync_with_stdio(false);
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
cin>>map1[i][j];
}
}
node e = bfs();
int x = 0;
int y = 0;
cout<<'('<<'0'<<','<<' '<<'0'<<')'<<endl;
for(int j=0;j<e.cnt;j++) //将路径打出
{
x += dis[e.l[j]][0];
y += dis[e.l[j]][1];
cout<<'('<<x<<','<<' '<<y<<')'<<endl;
}
return 0;
}
【2】更推荐第二个,有利于理解队列!
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
const int maxn = 5;
//都不想多说,开个数组都能re
int vis[maxn][maxn];
int map1[maxn][maxn];
int dis[4][2] = {1,0,-1,0,0,1,0,-1};
struct node{
int x;
int y;
int pre;
}q[30];
bool check(int x,int y)
{
if(x>=0 && x<5 && y>=0 && y<5 && map1[x][y] == 0 && !vis[x][y])
return true;
return false;
}
void print(int pos) //递归将路径打印出来
{
if(q[pos].pre != -1)
{
print(q[pos].pre);
cout<<'('<<q[pos].x<<','<<' '<<q[pos].y<<')'<<endl;
}
}
void bfs()
{
int front = 0;
int head = 1;
q[front].x = 0;
q[front].y = 0;
q[front].pre = -1;
while(front < head)
{
for(int i=0;i<4;i++)
{
int x1 = q[front].x + dis[i][0];
int y1 = q[front].y + dis[i][1];
if(check(x1,y1))
{
vis[x1][y1] = 1;
q[head].x = x1;
q[head].y = y1;
q[head].pre = front; //记录路径
head++;
}
if(x1==4 && y1==4)
print(front);
}
front++;
}
}
int main()
{
ios::sync_with_stdio(false);
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
cin>>map1[i][j];
}
}
memset(vis,0,sizeof vis);
cout<<'('<<'0'<<','<<' '<<'0'<<')'<<endl;
bfs();
cout<<'('<<'4'<<','<<' '<<'4'<<')'<<endl;
return 0;
}