版权声明:本文为博主原创,未经博主允许不得转载 https://blog.csdn.net/Sherry_Yue/article/details/87395896
Applese 走方格(C++)
题目描述
精通程序设计的 Applese 又写了一个游戏。
在这个游戏中,它位于一个 n 行 m 列的方阵中的左上角(坐标为(0, 0),行的序号为0∼n−1,列的序号为0∼m−1)。
现在它想不重复地走过所有格子(除了起点),最后回到左上角的一个方案。
每次只能往上下左右其中一个方向走一格。
输入描述:
仅一行两个整数 n 和 m,表示方阵的大小。保证大于1×1。
输出描述:
如果存在方案,则输出一行操作,包含"L"、“R”、“U”、“D”,分别表示左、右、上、下。如果有多种方案,输出任意一种即可。
如果没有方案,则在一行中输出"-1"。
示例1
输入
2 2
输出
RDLU
示例2
输入
2 3
输出
RRDLLU
备注:
1≤n,m≤10
题目思路:
大体思路参照下图。
根据 n 和 m 的奇偶分类讨论。
特殊情况1:1行2列或2行1列,可以直接输出答案
特殊情况2:只有一行,或只有一列,或奇数行奇数列时,无解
证明奇数行奇数列无解:
记奇数行奇数列的点为1,其余的点为2
那么原来的矩阵按类型标记,就变成了:
1 2 1 2 … 1
2 1 2 1 … 2
1 2 1 2 … 1
… … … … … …
1 2 1 2 … 1
可以发现,1的个数比2的个数要多1,而且1的四周必定为2,2的四周必定为1。
按照题目要求的方式行进,路径必然可以标记为212121…21(不算起始点(0,0))。而1的个数要比2多,所以不可能存在这样一条路径(以2开始,以1结束,且遍历所有的点)。
解题思路参考https://blog.csdn.net/w865629524/article/details/86694377
解题代码:
#include <iostream>
using namespace std;
int main()
{
int n,m;//n行m列
cin >> n >> m;
if( n==1 && m==2 ) cout << "RL" << endl;//1行2列
else if( n==2 && m==1 ) cout << "DU" << endl;//2行1列
else if( n==1 || m==1 || ( (n&1) && (m&1) ) )//只有一行,或一列,或奇数行奇数列时无解
cout << "-1" << endl;
else if( n%2==0 )//偶数行
{
int y = 1;
for(int i=1;i<m;++i) cout << "R";
cout << "D";
y++;
while( y<n )
{
if(y&1)//如果y是奇数
for(int i=2;i<m;++i)
cout << "R";
else//如果y是偶数
for(int i=2;i<m;++i)
cout << "L";
cout << "D";
y++;
}
for(int i=1;i<m;++i) cout << "L";
for(int i=1;i<n;++i) cout << "U";
cout << endl;
}
else//偶数列
{
int x = 1;
for(int i=1;i<n;++i)
cout << "D";
cout << "R";
x++;
while( x<m )
{
if( x&1 )//如果x是奇数
for(int i=2;i<n;++i)
cout << "D";
else//如果x是偶数
for(int i=2;i<n;++i)
cout << "U";
cout << "R";
x++;
}
for(int i=1;i<n;++i) cout << "U";
for(int i=1;i<m;++i) cout << "L";
cout << endl;
}
}