首页 > 其他分享 >P9425 [蓝桥杯 2023 国 B] AB 路线

P9425 [蓝桥杯 2023 国 B] AB 路线

时间:2024-05-12 20:20:00浏览次数:29  
标签:bf AB int P9425 更新 蓝桥 vis cnt 节点

P9425 [蓝桥杯 2023 国 B] AB 路线

一、问题简析

本题是一道 \(BFS\) 题。与普通的广搜题不同的是,本题中,格子可以多次访问。因此,vis 数组不能只用二维,要进行升维。

本题中,每个节点包含以下信息:

struct node
{
    pair<int, int> loc;     // 坐标
    char ch;                // 格子的值(A或B)
    int cnt;                // 累计经过A或B的个数
    int step;               // 累计步数
};

在普通深搜题中,我们令 vis[x][y] 表示坐标 (x, y) 是否访问过。若未访问,且满足一定条件,则更新节点,并加入队列。由于题意的限制,更新后的节点一定满足 1 <= node.cnt <= K。这就表明,在坐标 (x, y) 更新后的节点有 K 种可能的状态。在普通的深搜题的要求下——每个坐标只能访问一次,只能是 K 种状态中的一种。然而,在允许多次访问的题目中,需要考虑这 K 种状态。

回到本题,我们令 vis[x][y][k] 表示在坐标 (x, y) 处,更新后,是否有过节点 node.cnt == k。若没有,且满足一定条件,则更新节点,并加入队列。更新条件为:
设未更新前的节点为 bf; 下一个坐标为 (x, y)(合法的); 表示的字符为 A[x][y]

if A[x][y] == bf.ch
    if bf.cnt < K and !vis[x][y][bf.cnt + 1]
        // ... 更新节点
        vis[x][y][bf.cnt + 1] = true
else
    if bf.cnt == K and !vis[x][y][1]
        // ... 更新节点
        vis[x][y][1] = true

注:因为 1 <= node.cnt <= K,所以 vis 数组的第三维要比 K 大。

Code

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

typedef pair<int, int> P;
struct node{P loc; char ch; int cnt, step;};

int N, M, K;
char A[1005][1005];
bool vis[1005][1005][15];
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

bool check(P p)
{
	int x = p.first, y = p.second;
	if (1 <= x && x <= N && 1 <= y && y <= M)
		return true;
	return false;
}

int main()
{
	#ifdef LOCAL
	freopen("test.in", "r", stdin);
	#endif
	
	cin >> N >> M >> K;
	for (int i = 1; i <= N; ++i)
	{
		char ch = getchar();
		while (ch != '\n')
			ch = getchar();
		
		for (int j = 1; j <= M; ++j)
			A[i][j] = getchar();
	}
	
	queue<node> Q;
	Q.push(node{P(1, 1), 'A', 1, 0});
	vis[1][1][1] = true;
	while (!Q.empty())
	{
		node bf = Q.front();
		Q.pop();
		P p = bf.loc;
		
		if (p == P(N, M))
		{
			cout << bf.step << endl;
			return 0;
		}
		
		for (int i = 0; i < 4; ++i)
		{
			int x = p.first + dx[i], y = p.second + dy[i];
					
			if (!check(P(x, y)))    continue;
			
			if (A[x][y] == bf.ch)
			{
				if (bf.cnt < K && !vis[x][y][bf.cnt + 1])
				{
					Q.push(node{P(x, y), bf.ch, bf.cnt + 1, bf.step + 1});
					vis[x][y][bf.cnt + 1] = true;
				}
			}
			else
			{
				if (bf.cnt == K && !vis[x][y][1])
				{
					Q.push(node{P(x, y), A[x][y], 1, bf.step + 1});
					vis[x][y][1] = true;
				}
			}
		}
	}
	
	cout << -1 << endl;
	
	return 0;
}

标签:bf,AB,int,P9425,更新,蓝桥,vis,cnt,节点
From: https://www.cnblogs.com/hoyd/p/18188117

相关文章

  • csapp_实验_-__datalab
    Datalab前言该实验是《深入理解计算机系统》(英文缩写CSAPP)课程附带实验——Lab1:DataLab,对应书中第二章内容(信息的表示和处理),是所有实验中的第一个实验,**实验目的**datalab实验提供了一个文件夹,我们的目的只是改写bits.c中的15个函数,使其完成相应的功能即可。至于其他文件......
  • 蓝桥杯-错误票据(两种写法stringstream和扣字符)
    某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。你的任务是通过编程,找出断号的ID和重号的ID。假设断号不可能......
  • Datalab
    Datalab前言该实验是《深入理解计算机系统》(英文缩写CSAPP)课程附带实验——Lab1:DataLab,对应书中第二章内容(信息的表示和处理),是所有实验中的第一个实验,**实验目的**datalab实验提供了一个文件夹,我们的目的只是改写bits.c中的15个函数,使其完成相应的功能即可。至于其他文件......
  • [ABC261E] Many Operations 题解
    [ABC261E]ManyOperations题解思路解析首先可以发现,如果直接跑肯定会炸,于是考虑优化。首先发现操作有很多重复的,所以可以考虑把每一个数经过所有操作后的值都预处理下来,但这样显然空间也会炸。然后我们又想到可以不需要求下每个数经过操作后的值,可以把每一位二进制上在开始前......
  • ABC 261 复盘
    ABC261复盘[ABC261A]Intersection思路解析因为这题czl错了所以我特地来写个复盘可以想到两条线段的关系只有不相交,相交,包围三种,于是我们可以直接判断每种情况然后输出就好了,可以在判断前先将两条线段的位置判断一下交换方便之后操作。#include<bits/stdc++.h>usingnames......
  • ABC353 | 如同流星划过天空
    ABC353|如同流星划过天空A.&B.依题意模拟即可。C.注意只有\(f(x,y)\)需要对\(10^8\)取模,\(f\)的求和不需要。关注到\(a_i\in[1,10^8)\),故\(a_i+a_j\in[2,2\times10^8)\)。从而\(f(x,y)=[x+y<10^8](x+y)+[x+y\ge10^8](x+y-10^8)=x+y-10^8[x+y\ge10^......
  • ABC353C Sigma Problem 题解
    ABC353CSigmaProblem题解题目链接:AT题目中的两个求和符号\(\sum_{i=1}^{N-1}\sum_{j=i+1}^{N}\)实际上是在枚举所有的有序数对\((i,j)\)。而有序数对的个数\(N(N-1)/2=O(N^{2})\),真的去枚举所有数对肯定会T。这时应该考虑去拆贡献,求出每个\(A_i\)对答案的贡献。......
  • 蓝桥杯-递增三元组(三种解法,二分, 双指针, 前缀和)
    给定三个整数数组A=[A1,A2,…AN],B=[B1,B2,…BN],C=[C1,C2,…CN],请你统计有多少个三元组(i,j,k)满足:1≤i,j,k≤NAi<Bj<Ck输入格式第一行包含一个整数N。第二行包含N个整数A1,A2,…AN。第三行包含N个整数B1,B2,…BN。第四行包含N个整数C1,C2,…CN。输出格......
  • MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类|
    原文链接:http://tecdat.cn/?p=26318原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于长短期记忆(LSTM)神经网络的研究报告,包括一些图形和统计输出。此示例说明如何使用长短期记忆(LSTM)网络对序列数据的每个时间步长进行分类。要训​​练深度神经网络对序列数据......
  • ABC353E字典树处理最长公共前缀
    https://atcoder.jp/contests/abc353/tasks/abc353_e其实就是字典树板子题。似乎遇到最长公共前缀,就该想到字典树。依次加入每个字符串:维护一个数组siz来统计在当前串之前的串在对应点的出现次数。手模一下字典树的建树过程,显然如果当前串\(S_i\)能跑到一个曾经串\(S_......