1256:献给阿尔吉侬的花束

【算法分析】

广搜,迷宫问题模板题。

广搜使用队列这一数据结构。首先起点位置入队,而后每次出队一个位置,将该位置可以到达的所有与之相邻的位置入队,同时记录行走步数。如果到达终点位置,输出到达终点时的步数即为从起点到终点的最短距离。

假设地图中有n个格子,广搜的复杂度为O ( n )

【参考代码】

cpp 复制代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int m[202][202],p[400000][4];
int xx[4]={-1,1,0,0};
int yy[4]={0,0,-1,1};
int t,r,c,x1,y1;
char ch;
void bfs(){
	int x,y,t=0,w=1;
	while(w>t){
		t++;
		for(int i=0;i<4;i++){ //上下左右四个方向搜索 
			x=p[t][1]+xx[i];
			y=p[t][2]+yy[i];
			if(x>0&&x<=r&&y>0&&y<=c&&m[x][y]==0){ //如果坐标在范围内且没访问过 
				w++;
				p[w][1]=x;
				p[w][2]=y;
				p[w][3]=p[t][3]+1;
				m[x][y]=1;
				if(x==x1&&y==y1){
					printf("%d\n",p[w][3]);return;
				}
			}	
		}
	}
	printf("oop!\n");
}
int main()
{
	scanf("%d",&t);
	for(int k=1;k<=t;k++){
		scanf("%d %d",&r,&c);
		memset(m,0,sizeof(m));
		memset(p,0,sizeof(p));
		for(int i=1;i<=r;i++)
			for(int j=1;j<=c;j++){
				cin>>ch;
				if(ch=='S'){
					m[i][j]=1;p[1][1]=i,p[1][2]=j,p[1][3]=0;
				//如果字符等于s,map标记为1表示已访问过, p[1][1]=i表示队列第一个元素的x坐标为i
				//p[1][2]=j表示队列第一个元素的y坐标为j, p[1][3]=0示队列第一个元素的单位时间为0
				}
				else if(ch=='E'){ //x1,y1表示结束的坐标 
					x1=i;
					y1=j;
				}
				else if(ch=='#') m[i][j]=1; //如果字符等于#,map标记为1表示已访问过
		}
		bfs();
	}
	return 0;
}
相关推荐
草莓熊Lotso14 分钟前
Linux 基础 IO 初步解析:从 C 库函数到系统调用,理解文件操作本质
linux·运维·服务器·c语言·数据库·c++·人工智能
梵刹古音14 分钟前
【C语言】 字符数组相关库函数
c语言·开发语言·算法
闻缺陷则喜何志丹17 分钟前
P8699 [蓝桥杯 2019 国 B] 排列数|普及+
c++·数学·蓝桥杯·数论·洛谷·数列
D_evil__6 小时前
【Effective Modern C++】第三章 转向现代C++:16. 让const成员函数线程安全
c++
wfeqhfxz25887827 小时前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
Aaron15887 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
Queenie_Charlie8 小时前
前缀和的前缀和
数据结构·c++·树状数组
kokunka9 小时前
【源码+注释】纯C++小游戏开发之射击小球游戏
开发语言·c++·游戏
_不会dp不改名_9 小时前
leetcode_3010 将数组分成最小总代价的子数组 I
算法·leetcode·职场和发展
John_ToDebug10 小时前
浏览器内核崩溃深度分析:从 MiniDump 堆栈到 BindOnce UAF 机制(未完待续...)
c++·chrome·windows