1327C Game with Chips(思维,构造)

1327C Game with Chips(思维,构造)

题面

题意:有 n ∗ m n*m nm 的棋盘,上面有 k k k 个棋子,位于 ( s x i , s y i ) (sx_i,sy_i) (sxi,syi),有 4 4 4 种操作 U / D / L / R U/D/L/R U/D/L/R 分别可以让所有的棋子同时往上/下/左/右移动一格,没法进行对应方向移动的棋子留在原地(棋子可以重叠),每个棋子都有自己需要经过的点 ( f x i , f y i ) (fx_i, fy_i) (fxi,fyi),现在问在不超过 2 n m 2nm 2nm 次操作的条件下能不能让所有点经过自己需要经过的点,如果能给出操作次数以及具体操作方法,否则输出 − 1 -1 1

范围 1 ≤ n , m , k ≤ 200   ,   1 ≤ s x i , f x i ≤ n , 1 ≤ s y i , f y i ≤ m ​ 1 \le n,m,k \le 200~,~1 \le sx_i,fx_i \le n, 1 \le sy_i,fy_i \le m​ 1n,m,k200 , 1sxi,fxin,1syi,fyim

分析:题目并没有要求我们要给出最优解,显然是个构造题,注意到只需要不超过 2 n m 2nm 2nm 次操作,我们可以先用 n + m − 2 n+m-2 n+m2 次操作让所有棋子堆叠在左上角,再用 n m − 1 nm-1 nm1 次操作从左上角蛇形走到右下角,这样不论棋子原先在哪里,需要经过哪个点,都可以得到满足,只需要 n + m − 2 + n m − 1 = n + m + n m − 2 n+m-2+nm-1 = n+m+nm-2 n+m2+nm1=n+m+nm2,且对于所有的 n ≥ 1 n \ge 1 n1,满足 2 n m > n + m + n m − 2 ​ 2nm > n+m+nm-2​ 2nm>n+m+nm2,因此可以这样解,并且必定有解。

Code

#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;

const int MAXN = 200 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double eps = 1e-9;
const double PI = acos(-1.0);

int n, m, k;

inline int read()
{
    int s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
        s = s * 10 + ch - '0', ch = getchar();
    return s * w;
}

signed main()
{
    cin >> n >> m >> k;
    // 处理输入,根本不用管,直接输出一遍标准路径就可以了
    for (int i = 0; i < k; i++)
    {
        int x, y;
        cin >> x >> y;
    }
    for (int i = 0; i < k; i++)
    {
        int x, y;
        cin >> x >> y;
    }
    cout << (n - 1) + (m - 1) + (n * m - 1) << endl;
    // 先堆到左上角
    for (int i = 0; i < n - 1; i++)
    {
        cout << "U";
    }
    for (int i = 0; i < m - 1; i++)
    {
        cout << "L";
    }
    // 蛇形走到右下角
    for (int i = 0; i < m - 1; i++)
    {
        cout << "R";
    }
    for (int i = 1; i < n; i++)
    {
        cout << "D";
        for (int j = 0; j < m - 1; j++)
        {
            if (i % 2 == 0)
            {
                cout << "R";
            }
            else
            {
                cout << "L";
            }
        }
    }
    cout << endl;
    return 0;
}

【END】感谢观看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值