版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
【题目描述】
一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。
【输入】
第一行是两个整数,R和C,代表迷宫的长和宽。( 1≤ R,C ≤ 40)
接下来是R行,每行C个字符,代表整个迷宫。
空地格子用‘.’表示,有障碍物的格子用‘#’表示。
迷宫左上角和右下角都是‘.’。
【输出】
输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。
【输入样例】
5 5
…###
#…
#.#.#
#.#.#
#.#…
【输出样例】
9
【来源】
我对这题的评价:打字题。
这题确实有那么简单,数据范围又小,也能用DFS做,而且数组还可以开大点,
反正不要钱
有注释的代码:
#include <bits/stdc++.h> //C++的万能头文件
using namespace std; //名空间
int n,m,p[10008],q[10008],ans[108][108]; //不要钱的数组开大点
char a[108][108]; //用于存地图
int xx[5]= {0,1,-1,0,0}; //方向x
int yy[5]= {0,0,0,1,-1}; //方向y
void bfs() {
a[1][1]='#'; //设初始点为不可走
ans[1][1]=1; //初始点一步可以到
int head=1; //这个不用说
int tail=1; //这个也不用说
p[1]=1; //把第一个位置的方向x加入队列
q[1]=1; //把第一个位置的方向y加入队列
while(head<=tail) { //BFS扩展
for(int i=1; i<=4; i++) { //四个方向搜索
int h=p[head]+xx[i];
int l=q[head]+yy[i];
if(a[h][l]!='#'&&h>=1&&l>=1&&h<=n&&l<=m) {
a[h][l]='#'; //走过了,以防再走,所以设为不可走
//cout<<h<<" "<<l<<endl; //跟踪数据(检查时用)
//system("pause"); //跟踪数据(检查时用)
tail++; //有几个神奇的小朋友要进队列了
p[tail]=h; //神奇的小朋友1号,(方向x)
q[tail]=l; //神奇的小朋友2号,(方向y)
ans[h][l]=ans[p[head]][q[head]]+1; //把这个点的步数设为上一个点的步数+1
if(h==n&&l==m) { //判断是否到达终点
cout<<ans[h][l]<<endl; //输出结果
return ; //结束函数(易错点)
}
}
}
head++; //头结点++(易错点)
}
}
int main() {
cin>>n>>m; //输入长和宽
/*下面是输入*/
/*———————————————————*/
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin>>a[i][j];
}
}
/*———————————————————*/
/*上面是输入*/
bfs();
return 0;
}
无注释的代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,p[10008],q[10008],ans[108][108];
char a[108][108];
int xx[5]={0,1,-1,0,0};
int yy[5]={0,0,0,1,-1};
void bfs()
{
a[1][1]='#';
ans[1][1]=1;
int head=1;
int tail=1;
p[1]=1;
q[1]=1;
while(head<=tail)
{
for(int i=1;i<=4;i++)
{
int h=p[head]+xx[i];
int l=q[head]+yy[i];
if(a[h][l]!='#'&&h>=1&&l>=1&&h<=n&&l<=m)
{
a[h][l]='#';
tail++;
p[tail]=h;
q[tail]=l;
ans[h][l]=ans[p[head]][q[head]]+1;
if(h==n&&l==m)
{
cout<<ans[h][l]<<endl;
return ;
}
}
}
head++;
}
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
bfs();
return 0;
}