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

题解:P10234 [yLCPC2024] B. 找机厅

时间:2024-04-09 17:34:41浏览次数:30  
标签:used P10234 int 题解 路径 && 2005 yLCPC2024 cu

题意简述

给你一个长 \(n\) 宽 \(m\) 的 \(01\) 迷宫,从 \((1,1)\) 开始要走到 \((n,m)\)。如果能走那么输出最短路和路径(路径用 \(L R U D\) 表示),否则输出 \(-1\) 。有 \(t\) 组数据。

如果当前格子是 \(0\) 那么你只能走到 \(1\) 的格子,反之亦然。

思路

考虑使用 \(BFS\) ,每次走到这个点时遍历四个点(即上下左右),如果可以那么加入队列讲到这个点的路径加一。

记录路径

这也算这道题的难点,我们用一个 \(fa\) 的结构体来记录当前坐标的上一个最后在输出路径。

code

#include <bits/stdc++.h>
using namespace std;
struct node {
	int x, y, time;
} fa[2005][2005];
node cu,c;
string way;
int n, m;
char mp[2005][2005];
bool used[2005][2005];
int ans[2005][2005];
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
char dir[] = {'U', 'D', 'L', 'R'};
void find()
{
	way = "";
	while (cu.x != 1 || cu.y != 1) {
		c = fa[cu.x][cu.y];
		for (int i = 0; i < 4; i++) {
			if (c.x + dx[i] == cu.x && c.y + dy[i] == cu.y) {
				way += dir[i];
				break;
			}
		}
		cu = c;
	}
}
void bfs() {
	queue<node> q;
	q.push({1, 1});
	used[1][1] = true;
	ans[1][1] = 0;
	
	
	while (!q.empty()) {
		cu = q.front();
		q.pop();
		
		if (cu.x == n && cu.y == m) {
			cout << ans[cu.x][cu.y] << endl;
			
			find();
			
			for (int i = way.size() - 1; i >= 0; i--) {
				cout << way[i];
			}
			cout << endl;
			
			return;
		}
		
		for (int i = 0; i < 4; i++) {
			int tx = cu.x + dx[i];
			int ty = cu.y + dy[i];
			if (tx >= 1 && tx <= n && ty >= 1 && ty <= m && mp[cu.x][cu.y] != mp[tx][ty] && used[tx][ty]==0) {
				used[tx][ty] = 1;
				ans[tx][ty] = ans[cu.x][cu.y] + 1;
				fa[tx][ty] = {cu.x, cu.y, ans[tx][ty]};
				q.push({tx, ty});
			}
		}
	}
	
	cout << -1 << endl;
}

int main() {
	int t;
	cin >> t;
	
	for(int i=1;i<=t;i++)
	{
		cin >> n >> m;
		memset(used, false, sizeof(used));
		
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				cin >> mp[i][j];
			}
		}
		
		bfs();
	}
	return 0;
}

标签:used,P10234,int,题解,路径,&&,2005,yLCPC2024,cu
From: https://www.cnblogs.com/wenzhihao2023/p/18124408

相关文章

  • AtCoder Beginner Contest 348 A-F 题解
    A-PenaltyKickQuestion高桥将在一场足球比赛中获得\(N\)个点球。对于第\(i\)个罚球,如果\(i\)是\(3\)的倍数,他将罚球失败,否则罚球成功。请打印他罚球的结果。Solution当\(i\%3==0\)时说明能被\(3\)整除Code#include<bits/stdc++.h>usingnamespacest......
  • SP30785的题解
    (一)树链剖分板子题。支持单点取反,区间查询。在线段树的每一个节点上分别记录全为\(1\)或全为\(0\)。代码挺好理解的。(二)AC代码。#include<bits/stdc++.h>usingnamespacestd;constintmxn=3e5+10;intn,q,head[mxn],cnt,id[mxn],cntt,fa[mxn],cnt1,son[mxn],siz[m......
  • 【蓝桥·算法双周赛 第 9 场 小白入门赛】字符迁移【算法赛】题解(字符串+模运算+差分)
    思路差分数组是一种特殊的数组,它的第iii个数定义为原数组的第ii......
  • 【蓝桥·算法双周赛 第 4 场 小白入门赛】自助餐【算法赛】题解(分支+字符串)
    思路首先定义一个整型变量n和一个长整型变量ans,其中n用于存放输入的字符串个数,ans则用于累计所有字符串对应的价格。在接收到n之后,进入一个循环,在循环中,每次接收一个字符串s,并根据s的首字母判断该字符串对应的餐盘种类,并将其价格累加到ans中。具体来说,如果......
  • newstart 部分题解和pwn相关的学习
    做newstart的pwnpieee题的pie的学习首先:对于pieee这道题很简单的栈溢出,除了NX其他的保护都开了,然后呢在左边也发现了后门函数相对偏移为0x1264(对于这里我们只用关心后三位,因为pie不会随机化地址的低12位,通俗点说就是我们十六进制地址的后三位)而一般而言后三位的地址能够确定我......
  • 【题解】洛谷马的遍历
    马的遍历方法:广度优先搜索源代码如下#include<iostream>#include<queue>#include<cstdio>#include<cstring>usingnamespacestd;structcoord{//结构体定义x,y坐标intx,y;};queue<coord>Q;intans[500][500];//-1代表未访问intwalk[8......
  • Leetcode 第 390 场周赛题解
    Leetcode第390场周赛题解Leetcode第390场周赛题解题目1:3090.每个字符最多出现两次的最长子字符串思路代码复杂度分析题目2:3091.执行操作使数据元素之和大于等于K思路代码复杂度分析题目3:3092.最高频率的ID思路代码复杂度分析题目4:3093.最长公共后缀查询思......
  • CF1361E James and the Chase 题解
    Description给定一个有\(n\)个点\(m\)条边的有向强连通图。称一个点是好的当且仅当它到其他点都有且只有一条简单路径。如果好的点至少有\(20\%\)则输出所有好的点,否则输出-1。单个测试点内有多组数据。\(1\leqT\leq2\times10^3,1\leqn\leq10^5,1\leqm\leq2\time......
  • 任务处理【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-任务处理在某个项目中有多个任务(用tasks数组表示)需要您进行处理,其中tasks[i]=[si,ei],你可以在si<=day<=ei中的任意一天处理该任务。请返回你可以处理的最大任务数。注:一天可以完成一个任务的处理。输入描述:第一行为任务数量n,1<=n<=100000。后......
  • 跳马【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。给顶m行n列的棋盘(网格图),棋盘上只有有棋子象棋中的棋子“马”,并且每个棋子有等级之分,等级为k的马可以跳1~k......