题解:P17305 [ICPC 2026 Xi'an I] Yesterday Once More (Easy Version)
lailai0916 · · 题解
题意简述
网格中的障碍位置未知。构造一组不超过
解题思路
先用 R 走到第一行最右端。接下来使用关于竖直中线对称的构造:
其长度为:
为证明构造,先把列序反转。令原坐标的第 R 执行后,角色在新坐标的
反转列序仍保持「每行一个、每列至多一个」的障碍限制。下面证明这段标准方向的指令一定成功。
记第 RDLD 开始时的位置
设某一组的两次向下均失败。两个目标格位于下一行,而该行只有一个障碍。因此,两次下移时的列必须相同,中间的 L 没有成功。
若该列为 R 被当前行第 D 被下一行第
若该列大于 L 只能被当前行的障碍挡住。此前的 R 不可能成功,否则障碍会落在移动前角色所在的格子。当前行也不能再有另一个障碍,所以 R 只能被右边界挡住,此时
所以,每组 RDLD 要么使行号增加,要么进入上述停滞状态。后一状态会被后续同样的指令保持。执行
从第
若角色位于 URRD 后,前两步到达上一行障碍左侧。第二个 R 被该障碍挡住,D 又被当前行障碍挡住。最终位置为
到达第 URRD 的两个右移都能成功,随后下移到
剩余的 URRD 每次都先进入上一行,再向右移动,最后回到第 L,便会被该障碍挡在
斜线性质给出 DL 后,角色到达 D 一定会经过最后一行。
构造长度为
参考代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
string ans(n,'R');
for(int i=1;i<=n;i++)ans+="LDRD";
for(int i=1;i<n;i++)ans+="ULLD";
ans+=string(n,'R');
ans+="DR";
ans+=string(n,'D');
cout<<ans.size()<<'\n';
cout<<ans<<'\n';
return 0;
}