两个机器人

题目描述

你有两个机器人,站在平面上的两个点上,(x1,y1) (x2,y2)

机器人每次可以向上下左右四个方向中的某个方向移动一个单位

你给两个机器人发送了同样的指令序列,一个指令需要花一秒执行 但是两个机器人可能有一些bug,他们各自可能会忽略掉一些指令,可能会忽略所有指令,也可能一个指令都不会忽略

两个机器人如果移动到了同一个位置就会爆炸

你的任务是判断是否有可能爆炸

输入描述:

第一行输入四个整数x1,y1,x2,y2

-25 ≤ x1,y1,x2,y2 ≤ 25

第二行输入一个字符串表示指令序列,包含'U','R','L','D'四种字符

输出描述:

如果可能爆炸输出"Explosion", 否则输出"Safe"


示例1

输入

1 0 2 0

L

输出

Explosion


示例2

输入

1 0 2 0

U

输出

Safe


示例3

输入

1 0 2 0

UL

输出

Explosion

解题思路:

不妨先假设两个机器人的纵坐标相等。

此时如果有R指令,就让左边的机器人向右移动一个单位,右边的机器人不动。如果有L指令,就让左边的机器人不动,让右边的机器人向左移动一个单位。这两种情况下,不论是L指令还是R指令,机器人的距离都缩小了一个单位。当L和R指令出现的次数之和大于等于两机器人的横坐标之差的绝对值时,机器人就会相遇。

同理,若两机器人的横坐标相同,当U和D指令出现的次数之和大于等于两机器人的纵坐标之差的绝对值时,机器人就会相遇。

如果两机器人的横纵坐标都不相同呢?记住这一点:一个U或D可以让机器人的纵向距离减少一个单位,一个L或R可以让机器人的横向距离减少一个单位。此时答案呼之欲出了。只要U和D指令出现的次数之和大于等于两机器人的纵向距离,且L和R出现的次数之和大于等于两机器人的横向距离,机器人就会相遇,否则不会相遇

AC代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int x1,y1,x2,y2;
    char ar[1000];
    cin>>x1>>y1>>x2>>y2;
    scanf("%s",ar);
    int dx=abs(x1-x2);
    int dy=abs(y1-y2);
    int uct=0,dct=0,lct=0,rct=0;
    for (int i=0;i<strlen(ar);i++) {
        if (ar[i]=='U') uct++;
        else if (ar[i]=='D') dct++;
        else if (ar[i]=='L') lct++;
        else if (ar[i]=='R') rct++;
    }
    if ((uct+dct>=dy)&&(lct+rct>=dx))
        puts("Explosion");
    else
        puts("Safe");
    return 0;
}