解题思路:
可以把bfs当成扩散问题,如果下一步可以走,就向下一步扩散,直到遇见终点,停止循环。


参考代码:

#include <bits/stdc++.h>
#include <queue>
using namespace std;

const int S=41;//题目范围最大为40

struct node{
	int x,y,l;//横坐标和纵坐标  l为当前为第几步
};

int dx[4]={1,-1,0,0};//上 下 左 右 
int dy[4]={0,0,-1,1};
bool vis[S][S];//记录走没有走过
char p[S][S];
queue<node>q;//队列

void bfs(int n,int m){
	q.push({1,1,1}); //起点从(1,1)开始 当前为第一步
	
	while(!q.empty()){//队列不为空
		node now=q.front();
		vis[now.x][now.y]=1;//走过 标记为1
		q.pop();//取出队首 (队首已经在新创建的now中)
		
		if(now.x==n&&now.y==m){//找到终点,打印,结束循环
			cout<<now.l<<endl;
			break;
		}
		for(int i=0;i<4;i++){//上下左右的寻找
			int x=now.x+dx[i];
			int y=now.y+dy[i];
			if(x>0&&y>0&&x<=n&&y<=m){
				if(p[x][y]=='.'&&vis[x][y]==0){//可以走而且没有走过,放入队列
					vis[x][y]=1;//已经走过了,标记为1
					q.push({x,y,now.l+1});
				}
			}	
		}
	}
}

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>p[i][j];
		}
	}
	bfs(n,m);

 	return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论