zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    Decompiling XAPK Files
    ps4双手柄inputManager设置
    游客须知
    页面类
    Temp
    Web AppDomain
    委托和事件
    动态执行js
    遍历对象属性,成员,方法的方法
    用Windows操作系统的人有时会遇到这样的错误信息:
  • 原文地址:https://www.cnblogs.com/yuzilan/p/10626092.html
Copyright © 2011-2022 走看看