题目链接:http://poj.org/problem?id=3984
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和dfs,个人觉得bfs简单一点。。毕竟不用递归。。。因此就先试了试bfs的,dfs应该会更新。。应该会研究一下。。。
bfs篇:
好了,现在开一个结构体记录路径,用到了一个deque的容器,【然后每次记录路径,然后把这个路径存到一个队列中】这里非常重要!!是核心!!,用bfs解决。。。
不清楚deque的可以查一下或者看一下这个链接:
http://blog.csdn.net/qq_40482358/article/details/79335337
ok也可以看代码,代码我上面注释我感觉比较详细了。。。。
ac:代码有点长。。但大部分都是头文件。。遇到个新的就加上去。。已经这么多了啊。。
#include<stdio.h>
#include<string.h>
#include<math.h>
//#include<map> //这里map会冲突。。。
#include<deque>
#include<queue>
#include<stack>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define da 0x3f3f3f3f
#define xiao -0x3f3f3f3f
#define clean(a,b) memset(a,b,sizeof(a))// 雷打不动的头文件
//尝试bfs路径。。
struct dop{ //坐标(点)
int x,y;
};
struct rode{ //路径
deque<dop> r; //路径队列 (点的集合)
};
int fx[4]={0,0,-1,1},fy[4]={-1,1,0,0};//方向
int map[10][10]; //地图
int biaoji[10][10]; //是否走过
int l[10][10]; //路径长度
int main()
{
clean(biaoji,0); //初始化
clean(map,0);
int i,j,k=0;
for(i=0;i<5;++i)
{
for(j=0;j<5;++j)
cin>>map[i][j]; //输入地图
}
dop a; //初始点(起点)
a.x=0;
a.y=0;
biaoji[0][0]=1; //起点标记
rode r;
r.r.push_back(a); //起点加入路径
queue<rode> q; //一个路径的队列
q.push(r); //路径入列
while(q.size()) //存在路径
{
rode nr=q.front(); //提取第一个路径
dop nd=nr.r.back(); //现在的点(位置)
//输出最终的路径
if(nd.x==4&&nd.y==4) //如果到了目标点
{
//printf("%d\n",l[4][4]);//这个是我看路径长度的。。题上没有要求。。
while(nr.r.size()) //如果该队列的点(路径)仍存在
{
dop cand; //定义该点
cand=nr.r.front(); //该点是队首元素(点)
printf("(%d, %d)\n",cand.x,cand.y);//输出 注意中间有个空格!!!wa了几次。。。
nr.r.pop_front(); //将队首元素释放
}
return 0;
}
q.pop(); // 将该路径的释放
for(i=0;i<4;++i) //四个方向移动
{
rode canr=nr; //避免对一开始的路径影响(加入条参数路径)
int nx=nd.x+fx[i],ny=nd.y+fy[i];//向四周移动
if(nx>=0&&nx<5&&ny>=0&&ny<5) //在地图上
{
if(map[nx][ny]!=1&&biaoji[nx][ny]==0)//不是墙&&没走过
{
dop cand; //定义一个点
cand.x=nx; //x坐标
cand.y=ny; //y坐标
canr.r.push_back(cand);//将这个点放入现在这个路径的,路径(点)中
q.push(canr); //将这个路径加入队列
biaoji[nx][ny]=1;//标记该点走过了
l[nx][ny]=l[nd.x][nd.y]+1;//记录步数
}
}
}
}
return 0;
}
dfs篇:
额。。。dfs。。未完待续。。。
唉唉唉点个赞再走啊。。