当前位置: 首页 > news >正文

[笔记] abc454_e LRUD Moving

E - LRUD Moving

看这题可能会联想到一笔画,但由于此题是“经过所有点各一次”,而非“经过所有边各一次”,所以不可使用欧拉路算法。

我们先考虑如何判断是否有解。

注意到,网格图是一个二分图,而二分图可以被黑白染色。所以,黑白染色就成了网格上分析的重要方法。

\(i+j\) 的奇偶性染色,奇数染成白色,偶数染成黑色。

注意到,经过的点(算上头和尾)一定是 \(1\rightarrow0\rightarrow1\rightarrow...\rightarrow1\) ,共经过 \(n^2-1\) 个点,且黑点比白点多一个。

此时,对 \(n\) 的奇偶性进行讨论。

  1. \(n\) 为奇数

    \(n^2-1\) 为偶数,此时最后一个点一定为白色,而目标点 \((n,n)\) 应该为黑色,矛盾。所以 \(n\) 为奇数时无解。

  2. \(n\) 为偶数

    设禁入点 \((A,B)\)

    • 如果 \(2\mid(A+B)\) ,则 \((A,B)\) 为黑点。可以发现,这种情况下,走到的白点比黑点多一个,与上面的结论矛盾。所以无解。
    • 如果 \(2 \nmid (A+B)\) ,走到的黑点比白点多一个,符合条件,有解。

判断有解性后,我们再考虑如何构造出解。

注意到,如果禁入点不再最上方两行,我们可以绕一个弯把最上面两行消掉,如图:

4rj818kl.png (182×170)

\((n,m,a,b)\) 表示在一个 \(n\times m\) 的方格图中,以 \(a,b\) 为禁入点的问题。

则经过上面的操作,原问题 \((n,m,a,b)\) 可转化为:先按 \(\text{RR...RDLL...LD}\) 的方式走,再解决子问题 \((n-2,m,a-2,b)\) 。类似的,后两行、前两列、后两列也可以这么干:

  1. 如果禁入点不在后两行,则解决子问题 \((n-2,m,a,b)\)\(\text{DLL...LDRR...R}\) 走。
  2. 如果禁入点不在前两列,则\(\text{DD...DRUU...UR}\) 走 ,解决子问题 \((n,m-2,a,b-2)\)
  3. 如果禁入点不在后两列中,则解决子问题 \((n,m-2,a,b)\)\(\text{RUU...URDD...D}\) 走。

显然,四种情况必有一个满足,由此可用递归求解,边界条件即为 \(n=m=2\)

abc454_e
#include<bits/stdc++.h>
using namespace std;const int N=1e3+10;
string Ans;
int n,A,B;void solve(int a, int b, int c, int d){if(a==2 && b==2){if(c==1 && d==2) Ans+="DR";else Ans+="RD";return;}if(c>2){for(int i=1; i<b; i++) Ans+='R';Ans+='D';for(int i=1; i<b; i++) Ans+='L';Ans+='D';solve(a-2, b, c-2, d);}else if(a-c+1>2){solve(a-2, b, c, d);Ans+='D';for(int i=1; i<b; i++) Ans+='L';Ans+='D';for(int i=1; i<b; i++) Ans+='R';}else if(d>2){for(int i=1; i<a; i++) Ans+='D';Ans+='R';for(int i=1; i<a; i++) Ans+='U';Ans+='R';solve(a, b-2, c, d-2);}else{solve(a, b-2, c, d);Ans+='R';for(int i=1; i<a; i++) Ans+='U';Ans+='R';for(int i=1; i<a; i++) Ans+='D';}
}inline void SOLVE(){cin>>n>>A>>B;if((n&1) || !((A+B)&1)){cout<<"No\n"; return;}cout<<"Yes\n";Ans="";solve(n,n,A,B);cout<<Ans<<"\n";
}signed main(){cin.tie(0)->sync_with_stdio(0);int t; cin>>t;while(t--) SOLVE();return 0;
}
http://www.jsqmd.com/news/715901/

相关文章:

  • 我发现了一个很好用的 AI 编程 Skill:/grill-me
  • 向量引擎、GPT Image 2、deepseek v4、api、key 全都讲明白了:这届AI开发,真不是只会调用就够了
  • 不止于T+0:用通达信自定义公式,打造你的手机短线交易‘驾驶舱’
  • Rocky Linux 9上配置Chrony时间同步的保姆级教程(含阿里云、腾讯云NTP源)
  • 给硬件新手的LPDDR4上电初始化避坑指南:从Vdd上电顺序到CKE使能的关键时序
  • 多商户电商系统
  • League Akari 终极指南:快速掌握英雄联盟本地化效率工具
  • AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用
  • MCP插件报错无法复现?别再盲目重启!用VS Code内置Tracing + MCP Protocol Inspector抓取完整通信链路(含HTTP/2帧级日志解析)
  • 洛谷 B3622:枚举子集(递归实现指数型枚举)← DFS
  • 国内开源Claw类智能体
  • 告别僵硬抓取:聊聊软体机器人手在康复训练和精密装配中的那些潜力应用
  • StarRailCopilot深度解析:如何用模块化架构实现崩坏星穹铁道全流程自动化
  • UE5数字孪生入门:用Cesium for Unreal加载本地高精度DEM,快速构建城市级三维地形基底
  • 低查重AI写教材指南:精选工具助力,3天完成40万字教材产出!
  • Android系统升级变快了?聊聊GKI和KMI背后那些对开发者实实在在的影响
  • 【笔记】asp.net 中,为什么第二次压测的单核性能是第一次压测的 3.2 倍
  • OpCore Simplify:如何用4个步骤完成黑苹果EFI自动化配置
  • redis的快速使用
  • Python PEP 263 深入解析:源文件编码那些事
  • 智能硬件监控新范式:LibreHardwareMonitor的架构解析与实战指南
  • 别再只调sklearn默认参数了!SVR、MLP、RF回归模型实战调参避坑指南
  • 如何快速构建黑苹果EFI:OpCore Simplify的终极简化指南
  • 保姆级教程:在Deepin/UOS上手动打包最新版QQ为deb安装包(附字体乱码修复)
  • Windows风扇控制终极方案:5步打造你的静音散热系统
  • 别再傻傻分不清!0.96寸OLED屏SPI和IIC接口到底怎么选?附STM32F103C8T6接线图
  • Driver Store Explorer:Windows驱动管理的终极可视化解决方案
  • CUDA编程避坑指南:新手常犯的5个内存与线程配置错误(及解决方法)
  • **发散创新:基于Go语言的服务网格实践与流量治理实战**在微服务架构日益复杂的今天,**服务网格(Service
  • 告别参考文献格式焦虑:GB/T 7714-2015 BibTeX样式终极指南