【BFS】走迷宫(C++)

【题目描述】

一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。

给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。

【输入】

第一行是两个整数,R和C,代表迷宫的长和宽。( 1≤ R,C ≤ 40)
接下来是R行,每行C个字符,代表整个迷宫。
空地格子用‘.’表示,有障碍物的格子用‘#’表示。
迷宫左上角和右下角都是‘.’。

【输出】

输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。

【输入样例】

5 5
…###
#…
#.#.#
#.#.#
#.#…

【输出样例】

9

【来源】

No

提交 统计信息 提交记录

我对这题的评价:打字题。
这题确实有那么简单,数据范围又小,也能用DFS做,而且数组还可以开大点,

反正不要钱

在这里插入图片描述有注释的代码:

#include 		//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<
				//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 
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;
}

你可能感兴趣的:(信息学奥赛一本通)