题意翻译
国王独自一人在棋盘上。尽管他很孤独,但他并不会灰心,因为他有国家大事要做。例如,他必须对广场T进行正式访问。因为国王没有浪费时间的习惯,所以他想从目前的位置上尽量走最少的步数。请你帮他做这件事。
在一次移动中,国王可以到达有一个共同的边或一个共同的顶点的正方形上,(他通常可以移动到8个不同的方格上)。
输入格式
第一行包含方形s的棋盘坐标,第二行包含平方t。
棋盘坐标由两个字符组成,第一个是小写拉丁字母(从a到h),第二个是从1到8的数字。
输出格式
在第一行打印n - 国王移动的最小数量。然后在n行打印移动本身。每个移动用8:L,R,U,D,LU,LD,RU或RD中的一个来描述。
L,R,U,D分别针对左,右,上,下移动(根据图片),2字母组合代表对角线移动。如果答案不是唯一的,请打印其中的任何一个。
输入输出样例
输入样例#1: |
|
输出样例#1 |
|
思路:
要输出总共需要的最少步数,则可以斜移的先斜移,再看王需要横移和竖移多少步,先把斜移的输出,在输出平移的。总步数就是斜移步数和平移步数的和。
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int a,y;
char c,x;
scanf("%c%d\n%c%d",&c,&a,&x,&y);
int t=abs(c-x),k=abs(a-y),n=min(t,k),m=n+abs(t-k);
printf("%d\n",m);//总步数
for(int i=1;i<=n;++i)//斜移
{
if(c<x)putchar('R'),c++;
else putchar('L'),x++;
if(a<y)puts("U"),a++;
else puts("D"),y++;
}
for(int i=n;i<m;++i)//平移
if(a<y)puts("U");
else if(a>y)puts("D");
else if(c<x)puts("R");
else puts("L");
return 0;
}