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;
}