AT2282 [ABC051C] Back and Forth 题解

Description

在一个平面直角坐标系内,有一点 \(A(x_1,y_1)\) 和点 \(B(x_2,y_2)\) 你需要从 \(A\) 点走到 \(B\) 点,再走到 \(A\) 点,再走到 \(B\) 点,再回到 \(A\) 点。期间,你只能沿网格线走,除 \(A,B\) 点,其他任一格点都只能走一次,求最短路径(输出以 \(\texttt U,\texttt R,\texttt D,\texttt L\) 组成的字符串)。

Solution

如图,方格内的任意一条路径都相等,即3条灰线长度相等,且为 \(A,B\) 两点间最短路径。

但两红线在一来回后都有且仅有1次走过,所以,第二来回不能再走方格内的任一一条路径。

黄橙两线即为方格外最短路径,正确性显然。

输出四种方向即可。

Code

#include<bits/stdc++.h>
using namespace std;
int sx,sy,tx,ty;
int cx,cy;
int main(){
    cin>>sx>>sy>>tx>>ty;
    cx=tx-sx;
    cy=ty-sy;
    for(int i=1;i<=cy;i++){
        cout<<"U";
    }
    for(int i=1;i<=cx;i++){
        cout<<"R";
    }
    for(int i=1;i<=cy;i++){
        cout<<"D";
    }
    for(int i=1;i<=cx;i++){
        cout<<"L";
    }
    cout<<"L";
    for(int i=1;i<=cy+1;i++){
        cout<<"U";
    }
    for(int i=1;i<=cx+1;i++){
        cout<<"R";
    }
    cout<<"DR";
    for(int i=1;i<=cy+1;i++){
        cout<<"D";
    }
    for(int i=1;i<=cx+1;i++){
        cout<<"L";
    }
    cout<<"U";
    return 0;
}

完结撒花!!

posted @ 2023-01-12 09:59  larryyu_blog  阅读(30)  评论(2编辑  收藏  举报