首页 > 其他分享 >P10234 [yLCPC2024] B. 找机厅 题解

P10234 [yLCPC2024] B. 找机厅 题解

时间:2024-03-24 13:13:38浏览次数:19  
标签:pre 一个点 int 题解 BFS 机厅 yLCPC2024

题目简述

给定一个 $n$ 行 $m$ 列的 $01$ 矩阵,每次可以花费 $1$ 的时间移动到邻近的上下左右的四个格子,求从 $(1,1)$ 点到 $(n,m)$ 的最少时间,并给出具体路径。

题目分析

第一问

易发现是 BFS 模板题,在这里不多说。

第二问

我们首先考虑正着记录,即记录每一个点转移到了哪一个点,但是我们发现并不可行,因为它的下个点并不唯一。于是我们反着考虑,定义 $pre_{i,j}$ 为这个格子是从哪一个点转移过来的,由 BFS 的过程可知,$pre_{i,j}$ 是唯一的。

接下来就好做了,我们可以从终点回溯到起点,用一个循环即可,但要注意的是方向要反着来,因为是从终点往回走。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e3+10,INF=99999999;
int n,m,a[N][N],dis[N][N],vis[N][N],t;
pair<int,int> pre[N][N];
queue<pair<int,int>> q;
int tx[4]={1,-1,0,0};
int ty[4]={0,0,1,-1};
string s;
stack<char> path;
void solve()
{
    cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>s;
		for(int j=1;j<=m;j++)
		{
			a[i][j]=s[j-1]-'0';
			dis[i][j]=INF;
			vis[i][j]=0;
		}
	} 
	q.push({1,1});
	dis[1][1]=0;
	while(!q.empty())//BFS
	{
		
		int x=q.front().first;
		int y=q.front().second;
		q.pop();
		for(int i=0;i<4;i++)
		{
			int nx=x+tx[i];
			int ny=y+ty[i];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[x][y]!=a[nx][ny]&&!vis[nx][ny])
			{
				vis[nx][ny]=1;
				dis[nx][ny]=dis[x][y]+1;
				pre[nx][ny]={x,y};//记录
				q.push({nx,ny});
			}
		}
	}
	cout<<(dis[n][m]==INF?-1:dis[n][m])<<"\n";
	if(dis[n][m]==INF) return;
	int x=n,y=m;
	while(!(x==1&&y==1))//注意不是x!=1&&y!=1
	{
		int nx=pre[x][y].first;
		int ny=pre[x][y].second;
		if(nx==x-1&&ny==y) path.push('D');
		if(nx==x+1&&ny==y) path.push('U');
		if(nx==x&&ny==y-1) path.push('R');
		if(nx==x&&ny==y+1) path.push('L');
		x=nx,y=ny;
	}
	while(!path.empty())//用栈输出
	{
		cout<<path.top();
		path.pop();
	}
	cout<<"\n";
	return;
}
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>t;
    while(t--)
    {
    	solve();
	}
	return 0;
}

标签:pre,一个点,int,题解,BFS,机厅,yLCPC2024
From: https://www.cnblogs.com/zhuluoan/p/18092288

相关文章

  • CF1896C Matching Arrays 题解
    题目简述给定两个长度为$n$的数列$a,b$,再给定一个数$x$,请你判断是否存在一种重排$b$数列的方式,使得满足$a_i>b_i$的$i$恰好有$x$个。$n\leq2\times10^5$。题目分析遇到这种可行性问题,首先考虑做出最优解,以此来判断是否无解。接下来,可以思考最优解如何构造,我们......
  • CF1468J Road Reform 题解
    题目简述给定一个有$n$个节点,$m$条无向带权边的图,和一个参数$k$,第$i$条边权值为$s_i$。现在你要保留这个图中的$n-1$条边使得这个图变成一棵树,然后你可以对这棵树上的任意边进行修改,每次修改可以使这个边的权值加上一或减去一。现在你需要使所有边权的最大值正好等于......
  • 20240323每日一题题解
    20240323每日一题题解Problem输出2024是十二生肖中的哪个动物年?(只需要输出排行第几即可)鼠视为十二生肖中的第一位。注意:答案输出为阿拉伯数字。Solution首先,我要感谢班长在百忙之中选择了这样的一道题,让我在不是周末的周日能够抽出时间水题解报告。你说的对,但是《原神》......
  • CF1628D1 Game on Sum (Easy Version) 题解
    题目传送门(EasyVersion)|题目传送门(HardVersion)前置知识博弈论解法CF1628D1GameonSum(EasyVersion)设\(x_{i}\)表示第\(i\)轮时Alice选择的数。设\(f_{i,j}\)表示已经进行了\(i\)轮,且使用了\(j\)次加法时的最大得分,状态转移方程为\(f_{i,j}=\ma......
  • codeforces div_2 936 题解报告
    codeforcesdiv_2936题解报告比赛链接:https://codeforces.com/contest/1946A.MedianofanArray做法tag:签到题目翻译给定一个长度为\(n\)的数组\(a\),记数组中非降序排列中第\({\lceil\fracn2\rceil}\)个数是数组a的中位数。我们可以以下操作。选择一个数\(i\in[......
  • CF494C Helping People 题解
    题目传送门前置知识概率DP|树形DP|RMQ解法观察到区间只有相离或包含关系,类似线段树的管辖区间,考虑将其构成树形关系。为方便代码书写,将原来的森林构成一棵树,即增加一个区间\(l_{q+1}=1,r_{q+1}=n,p_{q+1}=0\)。由于对于一个区间\([l,r]\)的最大值在经历任意次操作后,......
  • CF922E Birds 题解
    题目传送门前置知识背包DP解法观察到\(w\)极大,若使用正常的背包空间会爆炸。依据AT_dp_eKnapsack2的经验,考虑将背包“反”着用。设\(f_{i,j}\)表示到第\(i\)棵树时一共召唤了\(j\)只小鸟时剩余的最大魔力值,状态转移方程为\(f_{i,j}=\min(\max\limits_{k=0}^{\m......
  • [暴力题解系列] 2023年蓝桥杯-冶炼金属
    世界上存在很难的题,但不存在暴力偷不到分的题​ 这题的暴力思路比你想的更简单,我直接枚举v的数值不就行了?#include<iostream>#include<algorithm>usingnamespacestd;inta[10010],b[10010];intmain(){intn;scanf("%d",&n);for(inti=1;i<=n;i++)......
  • P10268 符卡对决 题解
    题目链接:符卡对决视频讲解待上传经典的题目,对于这个\([l,r]\)询问,我们先关注期望怎么算。考虑方案总数和有效的和,方案总数显然有\(\dfrac{n\times(n-1)}{2}\),现在还需要关注有效和,我们关注对于若干个有效的关系用一个比较形象的数据结构表示-----并查集,那么两个卡牌之间有......
  • CF1711B Party 题解
    CF1711BParty原题题意给定$n$个点带点权的无向图,点权$a_i$保证无重边自环,点权非负),要求删去一些点和它相连的边,使得剩下这个图的边数为偶数且删去点的点权之和最小。问删去点的点权之和最小是多少?分类讨论我们分类讨论一下。$m$为偶数,则不需要删边或点,直接输出$0$即......