首页 > 其他分享 >2022-11-21 Acwing每日一题

2022-11-21 Acwing每日一题

时间:2022-11-21 13:34:36浏览次数:69  
标签:11 && 21 int 位置 起始 距离 队列 2022

本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的。同时也希望文章能够让你有所收获,与君共勉!

走迷宫

给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。

最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。

数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。

输入格式
第一行包含两个整数 n 和 m。

接下来 n 行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。

输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。

数据范围
1≤n,m≤100
输入样例:
5 5

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

输出样例:
8

算法原理

BFS的算法原理就是以起始位置作为中心点,以其他距离到起始位置的距离分类,我们先找出距离起始位置距离为1的,再找出距离起始位置距离为2的,不断循环求解,这里需要注意的是,这里搜索时是按照路径中的某一个位置状态去搜索他的四个方向,四个方向的四个位置就对应着四种状态,这就是这道题的状态转移方程,除此之外,BFS是用队列实现的,通用的模板就是只要队列里的元素不为空,那么我们就可以一直搜索,对于每一轮循环,我们先取出队头元素,然后用状态状态转移方程,搜索下一步的状态,判断下一步的状态是否满足要求,如果满足我们就将其存入队列里面。

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105;
typedef pair<int,int> PII;
int g[N][N],d[N][N];    // g表示地图上,d表示每个点距离起始点的距离(层数)
PII q[N*N];
int hh,tt;  // 因为在创建队列就已经加入了一个元素q[0] = {0,0}
int n,m;


int bfs(){
	int dx[4] = {-1,1,0,0},dy[4] = {0,0,-1,1};	// 上下左右,x轴正方向竖直向下,y轴正方向水平向左
	q[0] = {0,0};	// 初始化队列
	memset(d,-1,sizeof d);	// 初始化距离矩阵
	d[0][0] = 0;	// 初始化起始位置
	while(hh <= tt){	// 队列不空说明还有位置没有被搜索过,继续搜索
		PII t = q[hh++];	// 取出一个元素,别忘了 出队的元素头指针要向后移1位
		for(int i=0 ; i < 4 ; ++i){
			int x = t.first + dx[i],y = t.second + dy[i];	// 下一个方向的坐标
			if(x >= 0 && x < n && y >= 0 && y < m && g[x][y] != 1 && d[x][y] == -1){
				q[++tt] = {x,y};	// 如果该位置满足条件就将这个位置放进队列里
				d[x][y] = d[t.first][t.second] + 1;	// 标记这个位置关于原点的距离
			}
		}
	}
	return d[n-1][m-1];	// 根据BFS搜索特性我们可以知道最先标记的距离一定是最短距离
}

int main()
{
    cin >>n >> m;
    for(int i=0; i<n ; ++i)
        for(int j=0; j < m ; ++j)
            cin >> g[i][j];
    cout << bfs() << endl;
    return 0;
}

标签:11,&&,21,int,位置,起始,距离,队列,2022
From: https://www.cnblogs.com/WangChe/p/16911148.html

相关文章

  • ideaj2022.2.3激活
    通过补丁可以永久激活IDEA,前面IDEA安装方式都是一样的,主要是后面的步骤,注意看后面就行低版本参考教程:IDEA 2020.3最新永久激活码(免费激活到 2099 年,亲测有效)破......
  • 【221121-4】已知:正数a,b满足ab-a-b=1.求:a+b的最小值。
    ......
  • WIN 11 共享设置
    我的电脑->管理->用户->解除GUEST禁用gpedit.msc->计算机管理->本地->从网络上访问本机->允许GUEST高级共享设置->从网络上访问选择文件夹->共享......
  • UOJ #770. 【UER #11】切割冰片
    题面传送门挺高妙一个题。首先这种看方案数的,又互相限制的肯定找限制最少的,那么肯定是横着的最外面一条和竖着的最外面一条。若\(l_n<m\),则两者互相独立。否则两者都可......
  • 迅为iTOP3568开发板Android11获取root权限关闭selinux
    本文档所需资料在网盘资料“iTOP-3568开发板\02_【iTOP-RK3568开发板】开发资料\06_Android系统开发配套资料\02_Android11获取root权限配套资料”目录下。本文档参......
  • 2022 ICPC 合肥站 赛后小笔记
    2022ICPC合肥站赛后小笔记赛前由于上次CCPC威海站的教训(队友起晚了直接变成2人参赛),所以这次11点就开始呼唤队友赶快来。幸好大伙都来了,事实证明3>2。合肥铜首,威海......
  • oracle11 share pool,Oracle设置Shared Pool的大小
    SharedPool的大小设置规则如下:1.查到sharedpool设置的合理值,语句如下:select'SharedPool' component,shared_pool_size_for_estimateestd_sp_size,estd_lc_time_s......
  • 【Jmeter】21天打卡 08之取样器之http请求方法get/delete/put之间的请求
    1.新建测试计划-线程组-取样器(http请求三个,分别为get请求,put请求,delete请求)-添加监听器(查看结果树)2.在get请求中输入www.httpbin.org,接口为get,请求方法为:get请求内容:ge......
  • 113:组合
    ###组合“is-a”关系,我们可以使用“继承”。从而实现子类拥有的父类的方法和属性。“is-a”关系指的是类似这样的关系:狗是动物,dogisanimal。狗类就应该继承动物类。“......
  • 114:设计模式_工厂模式实现
       设计模式是面向对象语言特有的内容,是我们在面临某一类问题时候固定的做法,设计模式有很多种,比较流行的是:GOF(GoupOfFour)23种设计模式。当然,我们没有必要全部学习......