1. 程式人生 > 其它 >Codeforces Round #699 (Div. 2), problem: (A) Space Navigation

Codeforces Round #699 (Div. 2), problem: (A) Space Navigation

技術標籤:競賽

A. Space Navigation
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
You were dreaming that you are traveling to a planet named Planetforces on your personal spaceship. Unfortunately, its piloting system was corrupted and now you need to fix it in order to reach Planetforces.

在這裡插入圖片描述

Space can be represented as the XY plane. You are starting at point (0,0), and Planetforces is located in point (px,py).

The piloting system of your spaceship follows its list of orders which can be represented as a string s. The system reads s from left to right. Suppose you are at point (x,y) and current order is si:

if si=U, you move to (x,y+1);
if si=D, you move to (x,y−1);
if si=R, you move to (x+1,y);
if si=L, you move to (x−1,y).
Since string s could be corrupted, there is a possibility that you won’t reach Planetforces in the end. Fortunately, you can delete some orders from s but you can’t change their positions.

Can you delete several orders (possibly, zero) from s in such a way, that you’ll reach Planetforces after the system processes all orders?

Input
The first line contains a single integer t (1≤t≤1000) — the number of test cases.

Each test case consists of two lines. The first line in each test case contains two integers px and py (−105≤px,py≤105; (px,py)≠(0,0)) — the coordinates of Planetforces (px,py).

The second line contains the string s (1≤|s|≤105: |s| is the length of string s) — the list of orders.

It is guaranteed that the sum of |s| over all test cases does not exceed 105.

Output
For each test case, print “YES” if you can delete several orders (possibly, zero) from s in such a way, that you’ll reach Planetforces. Otherwise, print “NO”. You can print each letter in any case (upper or lower).

Example
inputCopy
6
10 5
RRRRRRRRRRUUUUU
1 1
UDDDRLLL
-3 -5
LDLDLDDDR
1 2
LLLLUU
3 -2
RDULRLLDR
-1 6
RUDURUUUUR
outputCopy
YES
YES
YES
NO
YES
NO
Note
In the first case, you don’t need to modify s, since the given s will bring you to Planetforces.

In the second case, you can delete orders s2, s3, s4, s6, s7 and s8, so s becomes equal to “UR”.

In the third test case, you have to delete order s9, otherwise, you won’t finish in the position of Planetforces.

本題很簡單,對於二維座標系來說,從原點到任意位置,本題處理過程中只是要求該點的可到達性,如果某些步驟如果影響可到達性那麼只需要忽略這個步驟即可,那麼就是判斷四種方向的累計和是不是不小於對應點的座標的絕對值即可。
需要注意的是,分類討論的時候需要把不同情況分類清楚即可
本題也可以逆向去做,直接在可到達點根據相應的操作進行相減即可

程式碼:

#include<bits/stdc++.h>
using namespace std;
#define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
int main()
{
    FAST;
    int n;
    int t;
    cin>>t;
    while(t--)
    {
        bool flag=false;
        int x,y;
        cin>>x>>y;
        string a;
        int b[4];//儲存四個方向的累計和
        cin>>a;
        memset(b,0,sizeof(b));
        for(int i=0;i<a.size();i++)
        {
            if(a[i]=='R')  b[0]++;
            if(a[i]=='L')  b[1]++;
            if(a[i]=='U')  b[2]++;
            if(a[i]=='D')  b[3]++;
        }
        if(x>0&&y>0)  {//分類討論
            if(b[0]>=x&&b[2]>=y)
            {
                flag=true;
            }
        }
        if(x>0&&y<0){
            y=(-1)*y;
            if(b[0]>=x&&b[3]>=y)
            {
                flag=true;
            }
        }
        if(x<0&&y>0){
            x=(-1)*x;
            if(b[1]>=x&&b[2]>=y)
            {
                flag=true;
            }

        }
        if(x<0&&y<0){
            x=(-1)*x;
            y=(-1)*y;
            if(b[1]>=x&&b[3]>=y){
                flag=true;
            }
        } 
        if(x==0&&y>0)  {
            if(b[2]>=y)
            {
                flag=true;
            }
        }
        if(x==0&&y<0){
            y=(-1)*y;
            if(b[3]>=y)
            {
                flag=true;
            }
        }
        if(x>0&&y==0){
            if(b[0]>=x)
            {
                flag=true;
            }

        }
        if(x<0&&y==0){
            x=(-1)*x;
            if(b[1]>=x){
                flag=true;
            }
        } 
        if(flag)
        {
            cout<<"YES"<<endl;
        }
        else
        {
            cout<<"NO"<<endl;
        }
        flag=false;
    }
   //system("pause");
}