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
说明:
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; } }