题解 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;//完美的结束
}