• 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;
        }
    }
    
  • 相关阅读:
    noip2001统计单词个数
    查看大图 zoomImage
    图片懒加载 lazyload
    ANSI_NULLS 和 QUOTED_IDENTIFIER
    Framewrok损坏导致卸载不了的解决办法
    kindeditor 上传图片 显示绝对 路径
    Could not load file or assembly 'MagickNet.dll'
    sql server 复制 需要有实际的服务器名称才能连接到服务器……
    iisapp 命令 弹出 iisschlp.wsc [88,25] 属性值无效 progid
    IIS 301重定向 报错 地址后面有eurl.axd
  • 原文地址:https://www.cnblogs.com/yuzilan/p/10626092.html
Copyright © 2020-2023  润新知