【问题描述】
【解决思路】
由题意可知,王的移动方向有八个,移动距离为一格。
现在需要从棋盘的一个坐标点移动到另一个坐标点,移动的步数即为横向位移绝对值与纵向位移绝对值二者中的最大值。
根据横向与纵向的位移(包括距离和方向)可以通过循环轻而易举地求出每一步的移动(多种情况下列举出一种即可)。
【代码实现】
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
char src[2];
char dst[2];
cin >> src >> dst;
int horizontal = dst[0] - src[0]; // 横向距离
int vertical = dst[1] - src[1]; // 纵向距离
cout << (abs(horizontal) > abs(vertical) ? abs(horizontal) : abs(vertical)) << endl;
// 对角移动
if(horizontal > 0 && vertical > 0)
while(horizontal > 0 && vertical > 0)
{
printf("RU\n");
horizontal--;
vertical--;
}
else if(horizontal > 0 && vertical < 0)
while(horizontal > 0 && vertical < 0)
{
printf("RD\n");
horizontal--;
vertical++;
}
else if(horizontal < 0 && vertical > 0)
while(horizontal < 0 && vertical > 0)
{
printf("LU\n");
horizontal++;
vertical--;
}
else if(horizontal < 0 && vertical < 0)
while(horizontal < 0 && vertical < 0)
{
printf("LD\n");
horizontal++;
vertical++;
}
// 对边移动
if(horizontal > 0)
while(horizontal > 0)
{
printf("R\n");
horizontal--;
}
else if(horizontal < 0)
while(horizontal < 0)
{
printf("L\n");
horizontal++;
}
else if(vertical > 0)
while(vertical > 0)
{
printf("U\n");
vertical--;
}
else if(vertical < 0)
while(vertical < 0)
{
printf("D\n");
vertical++;
}
}
后来参考别人的AC代码,发现代码可以进一步简化为:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
char src[2];
char dst[2];
cin >> src >> dst;
int horizontal = dst[0] - src[0]; // 横向距离
int vertical = dst[1] - src[1]; // 纵向距离
cout << max(abs(horizontal), abs(vertical)) << endl;
while(horizontal > 0 || vertical > 0)
{
if(horizontal > 0)
{
printf("R");
horizontal--;
}
else if(horizontal < 0)
{
printf("L");
horizontal++;
}
if(vertical > 0)
{
printf("U");
vertical--;
}
else if(vertical < 0)
{
printf("D");
vertical++;
}
cout << endl;
}
return 0;
}