[BFS广度优先搜索] 迷宫

news2024/9/21 14:31:07

描述

给定一个仅由数字 0 与 1 组成的 n 行 m 列的迷宫。若你位于一格 0 上,那么你可以移动到相邻 4 格中的任意一格 1 上;同样地,若你位于一格 1 上, 那么你可以移动到相邻 4 格中的任意一格 0 上。

现在,有 q 次询问。每次询问从给定的某一格 (第 x 行,第 y 列,均从 0 开始标号) 开始,在规则内任意移动。这样,有一些格子是可能到达的,而其余格子是无法到达的。求可能到达的格子数量。

输入

输入第一行包含两个整数 n 和 m(1 ≤ n, m ≤ 103)。
接下来 n 行,每行包含 m 个 0 或 1 的整数,表示迷宫的内容。
接下来一行包含一个整数 q(0 ≤ q ≤ 105)。
接下来 q 行,每行包含两个整数 x 和 y,表示一次询问(0 ≤ x < n,0 ≤ y < m)。

输出

输出 q 行,每行一个整数,依次表示每个询问的答案。

样例输入

5 4
1 1 0 1
1 1 1 1
1 1 0 0
0 0 1 1
0 1 0 0
4
4 3
0 1
3 0
1 1

样例输出

4
11
2
1

提示

对于第二条询问,如图所示,从黄色格子 (0, 1) 出发,可分别到达所有绿色格子,包含自身共 11 格。

 解题分析

这道题目首先可以看出是一道很经典的BFS广度优先搜索的题目。我们只需要用一个队列,一个visited数组,一些规则与判断就可以比较容易地去遍历我们能够到达的所有格子。但是很显然,如果我们每一个格子都这样去遍历的话,最后询问次数一旦多了起来,就很容易超时。所以我们想到了一个可以用一个数组记录下来的方法,这个时候我们还要想到其实按照题目所述的做法,我们这样是对称的。也就是说这是一个“连通块”,我们只需要找出这些连通块,每次遍历一遍后把所有走过的连通块都标记上相同的步数即可。为了更加便捷快速,我们可以用一个巧妙的自定义结构体Node创建一个数组,然后记录下我们走过的格子的位置路径,一路保存下来然后最后直接用一个循环去遍历更新即可。最后,我们的输入输出就变简单了,如果是我们已经遍历更新过的位置,那么我们直接输出路径的长度(或者说是遍历的所有格子的数量),如果是我们还没有遍历的位置,我们就调用bfs函数遍历一遍再输出我们的答案即可。

代码实现

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
// #include <iomanip>
#include <map>
#include <stack>
#include <list>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <sstream>
#define INF (1<<30)

using namespace std;

struct node{
	int x,y;
} f[10000100];

int n,m;
char maze[1001][1001]={0};
int record[1001][1001]={0};
bool visited[1001][1001]={0};
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};

void bfs(int x,int y){
	queue<node> q;
	q.push({x,y});
	visited[x][y]=1;
	node tmp;
	int t=0;
	while(!q.empty()){
		tmp=q.front();
		q.pop();
		if(record[tmp.x][tmp.y]) continue;
		for(int i=0;i<4;i++){
			int nx = tmp.x + dx[i] , ny = tmp.y + dy[i];
			if(nx <= 0 || ny <= 0 || nx > n || ny > n) continue;
			if(visited[nx][ny] || record[nx][ny]) continue;
			if(maze[nx][ny]==maze[tmp.x][tmp.y]) continue;
			q.push({nx,ny});
			visited[nx][ny]=1;
			f[t].x=nx; f[t].y=ny;
			t++;
		}
	}
	record[x][y]=t+1;
	for(int i=0;i<t;i++){
		record[f[i].x][f[i].y]=t+1;
	}
}


int main(){
    scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
			scanf("%s",maze[i]+1);
		}
	int tmpx,tmpy;
	for(int i=0;i<m;i++){
		scanf("%d%d",&tmpx,&tmpy);
		if(record[tmpx][tmpy]) printf("%d\n",record[tmpx][tmpy]);
		else {
			bfs(tmpx,tmpy);
			printf("%d\n",record[tmpx][tmpy]);
		}
	}
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2086548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11.STL

STL阶段 禁止复制 文本查询扩展作业解析 get_file函数的作用就是进行预处理操作&#xff0c;将文件中的每一行的内容放在shared_ptr<vector<string>> file里面进行存储&#xff1b;然后对每一个单词进行处理&#xff0c;将单词与行号放在map<string, shared_p…

【C/C++】C++类与对象基本概念(抽象封装、类的定义与使用、构造函数、析构函数、静态成员、友元)

目录 七、类与对象基本概念7.1 抽象7.2 类的定义与声明7.3 访问控制7.4 类的实现与使用7.5 对象指针、this指针与对象引用7.6 构造函数7.7 析构函数7.8 拷贝构造函数7.9 类类型作为函数参数7.10 对象数组7.11 静态成员7.12 常对象与常成员&#xff08;const&#xff09;7.13 友…

金融知识普及月答题活动

金融知识普及月答题活动 关键词&#xff1a;金融安全、风险防范、金融常识、反诈宣传 推荐功能&#xff1a;答题、倡议书 宣传角度&#xff1a; 1. 普及金融知识&#xff1a;讲解货币、信用、利率、汇率等基本金融概念&#xff0c;以及储蓄、贷款、信用卡、保险等常见金融产…

揭秘Xinstall:如何降低你的App推广成本?

在移动互联网时代&#xff0c;App推广成为了每个开发者都必须面对的问题。然而&#xff0c;随着市场竞争的加剧&#xff0c;App推广成本也水涨船高&#xff0c;让许多开发者望而却步。今天&#xff0c;我们就来聊聊如何借助Xinstall这一神器&#xff0c;有效降低App推广成本&am…

电商人必看:1个工具,5倍效率,批量处理图片就是这么简单

作为电商运营者或经常处理图片的你&#xff0c;是否厌倦了繁琐的图片编辑工作&#xff1f;今天&#xff0c;我要分享一个实用的解决方案——图片批量处理工具。 神器介绍&#x1f447; 千鹿设计助手&#xff0c;是一款轻量级、功能非常丰富的设计插件工具合集软件。 拥有多款…

宏集MIRO-L230工业路由器: 一站式全球联网解决方案

在日益互联的世界中&#xff0c;全球覆盖的稳定连接已成为业务成功的关键因素。宏集非常高兴地向您介绍我们的最新创新产品——MIRO-L230工业路由器&#xff0c;这是一款为现代企业量身定制的LTE路由器&#xff0c;为用户带来前所未有的稳定连接体验。 宏集MIRO-L230工业路由器…

Leetcode3234. 统计 1 显著的字符串的数量

Every day a Leetcode 题目来源&#xff1a;3234. 统计 1 显著的字符串的数量 解法1&#xff1a;枚举左端点 注意到&#xff0c;如果子串中的 0 非常多&#xff0c;多到 0 的个数的平方比 1 的个数都要大&#xff0c;那么这样的子串必然不是 1 显著子串。 设 cnt0 为子串中…

使用excel把json文件转为表格

json文件格式 [ { "ID": "16", "名称": "测站", "管理ID": "3", "管理名称": "土", "辅助信息": { "百度经度&qu…

macos MacPort 包管理工具安装和使用

在macos v10.15版本中, xz, python等软件无法使用brew安装, 原因是brew对于旧版本的macos不再支持, 但是我们可以使用另外一个macos下的包管理工具来安装brew无法安装的软件, macport 是一个和brew类似的macos下的一个非常优秀的软件包安装管理工具. MacPort安装前提条件 安…

解锁高效API测试之道:Apipost安装

在当今这个以API为中心的数字时代&#xff0c;无论是开发、测试还是管理API&#xff0c;一个得心应手的工具都能显著提升工作效率。如果你正寻求一款既强大又易于使用的API测试工具&#xff0c;那么Apipost绝对是你不容错过的选择。 接下来&#xff0c;让我们一起去完成这款软件…

zsh 添加 用户@主机 路径显示

export PROMPT"%F{green}%n%F{blue}%F{yellow}%m%F{cyan}:[%~]%f %# " export PROMPT"%F{green}%n%F{blue}%F{yellow}%m%F{cyan}:[%~]%f %$ " bash则为 PS1\u\h:\w\$

vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率

文章目录 什么是Mock数据使用Mock数据的优点Mock数据使用步骤一、安装依赖mockjs、vite-plugin-mock二、vite.config.ts 文件中配置三、在根目录下创建mock文件四、编写api接口调用文件1、src文件夹下新建utils/request.ts2、src文件夹下新建api/user.ts 五、业务页面调用六、M…

ESXI8虚拟机vmdk文件备份到本地硬盘

1. Esxi开启ssh服务 点击“管理”→“服务” →“TSM-SSH”&#xff0c;右击启动 2. 把datastore1中所有虚拟机文件(包括vmdk文件)复制到d:\E1 使用xshell等工具SSH登录ESXI8后台&#xff0c;确认datastore1的具体文件夹路径 在win10&#xff0c;使用cmd&#xff0c;在d:\E1…

docker续3:dockerfile

一、使用Dockerfile创建应用镜像 在Docker file中定义所需要执⾏的指令&#xff0c;使⽤ docker build创建镜像&#xff0c;过程中会按照dockerfile所定义的内容进⾏打开临时性容器&#xff0c;把docker file中命令全部执⾏完成&#xff0c;就得到了⼀个容器应⽤镜像&#xff…

力扣第二阶段Days34

1,题目描述-找出字符串中所有的字母异位词 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 2&#xff…

安科瑞预付费电能计量装置 功能介绍

安科瑞DTSY1352 三相无线预付费电能表是为测量额定频率 50Hz 的三相交流有功电能设计的高性能设备。这些电能表不仅支持预付费控制、负载和时间控制&#xff0c;恶性负载控制等多种控制模块&#xff0c;还具备多种通信功能&#xff0c;包括 RS485、NB、4G、LoRa、LoRaWAN、Wi-F…

SpringIoc体系结构设计

IOC容器的整体功能 从这个图仔细体会Spring框架加载Bean的过程. 有一个全局观. 1:加载Bean的配置&#xff08;比如xml配置 注解配置)不同类型资源的加载&#xff0c;解析成生成统一Bean的定义. 2:根据Bean的定义加载生成Bean的实例&#xff0c;并放置在Bean容器中 3:对容器中…

【C++ Qt day2】

2.完成课堂上的多文件编译 head.h main.cpp student.cpp 3. 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h…

Sentinel-1 Level 1数据处理的详细算法定义(八)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程&#xff0c;以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

PixPin 付费版 - 长截图贴图标注软件工具

在日常的工作和生活中&#xff0c;我们常常需要用到截图工具。而今天&#xff0c;给大家介绍一款功能超级强大的智能截图贴图工具 PixPin。 PixPin 适用于 Win 和 Mac 系统&#xff0c;支持自定义范围或窗口截图&#xff0c;让你可以精准地截取所需内容。 软件的长截图功能是它…