列表

详情


NC25659. 寻找路径

描述

有一个用于训练机器人的方格迷宫,左下角为入口,位置记为 (0,0),右上角的点是出口,位置记为 (m,n),相邻两个交叉路口之间的距离为 1 个单位长度。 
一个人工智能机器人从迷宫的入口开始,按照提前计算好的指令串行走,如果读取到当前为 "U" 指令则向上走 1 个单位长度,是 "R" 指令则向右走 1 个单位长度。 
在以某种顺序执行完n个 "U" 指令, m 个 "R" 指令后,机器人来到了迷宫出口。  
现在轮到人工智能 SK 出发了,他也来到了入口,作为一个机器人,他也只能按照读取指令串的方式行走。 
然而人工智能 SK 并不想和上一个机器人走出重复的路径,亦即不能经过相同的边(但是可以有公共点),你能帮他指定一个可行的指令串,从而快速走到迷宫出口吗?  

输入描述

第一行是一个正整数 T(T<=25),表示测试数据的组数。
对于每组测试数据,
第一行是两个正整数 n 和 m ,保证 n, m 均不大于 50000。
第二行一个长度为n+m的字符串,表示第一个机器人所走的指令,保证字符串中恰好出现 n 个 "U" 以及 m 个"R"。
保证所有测试数据输入字符串的总长度不超过150000。

输出描述

对于每组测试数据,输出一行只包含大写字母"U" 和"R"的字符串,表示可行的指令串。
要求在满足成功走到迷宫出口的前提下,还要保证和所给机器人的路径没有相同的边。
输出任意一个合法解即可,如果不存在合法路径,则输出一行"impossible"(不含引号)。

示例1

输入:

3
1 2
URR
2 2
URUR
4 5
RUURRUURR

输出:

RRU
RURU
URRRRUURU

说明:

第三组样例输入输出如图所示,黑色路径代表输入,红色路径表示输出的合法解:

方案不唯一,比如另一个解"URRRRRUUU"显然也是合法的。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 5ms, 内存消耗: 760K, 提交时间: 2023-03-23 18:14:04

#include <bits/stdc++.h>
using namespace std;

int main() {
	size_t T;
	cin >> T;
	while (T--) {
		size_t n, m;
		string str, res;
		cin >> n >> m >> str;
		if (str.front() == 'U' && str.back() == 'U') {
			for (size_t i = 2; i != n + m; ++i) if (str[i] == 'R' && str[i - 1] == 'R') {
				res = string(count(str.begin(), str.begin() + i, 'R'), 'R') + string(n, 'U');
				res.append(n + m - res.size(), 'R');
				break;
			}
			if (res.empty()) res = "impossible";
		}
		if (str.front() == 'U' && str.back() == 'R') {
			res = string(m, 'R') + string(n, 'U');
		}
		if (str.front() == 'R' && str.back() == 'U') {
			res = string(n, 'U') + string(m, 'R');
		}
		if (str.front() == 'R' && str.back() == 'R') {
			for (size_t i = 2; i != n + m; ++i) if (str[i] == 'U' && str[i - 1] == 'U') {
				res = string(count(str.begin(), str.begin() + i, 'U'), 'U') + string(m, 'R');
				res.append(n + m - res.size(), 'U');
				break;
			}
			if (res.empty()) res = "impossible";
		}
		cout << res << endl;
	}
}

上一题