题目链接:https://ac.nowcoder.com/acm/contest/330/B
题目描述
精通程序设计的 Applese 又写了一个游戏。在这个游戏中,它位于一个 n 行 m 列的方阵中的左上角(坐标为(0, 0),行的序号为0∼n−10∼n−1,列的序号为0∼m−10∼m−1)。现在它想不重复地走过所有格子(除了起点),最后回到左上角的一个方案。每次只能往上下左右其中一个方向走一格。
输入描述:
仅一行两个整数 n 和 m,表示方阵的大小。保证大于1×11×1。
输出描述:
如果存在方案,则输出一行操作,包含"L"、"R"、"U"、"D",分别表示左、右、上、下。如果有多种方案,输出任意一种即可。
如果没有方案,则在一行中输出"-1"。
思路:n==1&&m==2和n==2&&m==1时有路,除此之外n==1||m==1则没路,n、m同时为奇数时没路,其他情况有路,通过n、m的奇偶构造路线。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int nn=n%2;
int mm=m%2;
if(n==1&&m==2){
puts("RL");return 0;
}
if(n==2&&m==1){
puts("DU");return 0;
}
if((nn&&mm)||n==1||m==1)//两边都是奇数
{
puts("-1");
return 0;
}
if(nn)//n是奇数
{
cout<<"D";
int t=0;
while(1)
{
for(int i=0;i<=n-3;i++) cout<<"D";
cout<<"R";t++;if(m-1<=t) break;
for(int i=0;i<=n-3;i++) cout<<"U";
cout<<"R";t++;if(m-1<=t) break;
}
for(int i=0;i<=n-2;i++) cout<<"U";
for(int i=0;i<=m-2;i++) cout<<"L";
}
else //m是奇数或都是偶数
{
cout<<"R";
int t=0;
while(1)
{
for(int i=0;i<=m-3;i++) cout<<"R";
cout<<"D";t++;if(n-1<=t) break;
for(int i=0;i<=m-3;i++) cout<<"L";
cout<<"D";t++;if(n-1<=t) break;
}
for(int i=0;i<=m-2;i++) cout<<"L";
for(int i=0;i<=n-2;i++) cout<<"U";
}
}