4B.Applese 走方格(C++)

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;
    }
}
原文地址:https://www.cnblogs.com/yuzilan/p/10626092.html