题解 CF350C 【Bombs】

· · 题解

水题ing……

本题思路:

1.首先把所有炸弹排序,保证机器走的时候不会吃压到炸弹。 2.算出来一共走的路程,并按最短指令依次输出。

具体代码如下:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
struct node{
    int x, y;
};
node a[100010];

bool pai(node x1, node y1){
    return abs(x1.x) + abs(x1.y) < abs(y1.x) + abs(y1.y);//鬼畜的排序规则
}

int main( ){
    int n, sum = 0;
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i].x >> a[i].y;
        //算路径过程↓
        if(a[i].x != 0){
            sum += 2;
        }
        if(a[i].y != 0){
            sum += 2;
        }
        sum += 2;
    }
    sort(a + 1, a + n + 1, pai);
    cout << sum << endl;
    for(int i = 1; i <= n; i++){
        //指令过程↓
        if(a[i].x != 0){
            if(a[i].x < 0){
                printf("1 %d L\n", 0 - a[i].x);
            }else{
                printf("1 %d R\n", a[i].x - 0);
            }
        }
        if(a[i].y != 0){
            if(a[i].y < 0){
                printf("1 %d D\n", 0 - a[i].y);
            }else{
                printf("1 %d U\n", a[i].y - 0);
            }
        }
        cout << "2" << endl;
        if(a[i].y != 0){
            if(a[i].y < 0){
                printf("1 %d U\n", 0 - a[i].y);
            }else{
                printf("1 %d D\n", a[i].y - 0);
            }
        }
        if(a[i].x != 0){
            if(a[i].x < 0){
                printf("1 %d R\n", 0 - a[i].x);
            }else{
                printf("1 %d L\n", a[i].x - 0);
            }
        }
        cout << "3";
        if(i != n){
            cout << endl;//不知道有没有用,写了再说。
        }
    }
    return 0;//完美的结束
}