一个棋盘,用字母和数字表示横轴和竖轴,可以向八个方向移动,求最短路并写出路径。
最简单的想法就是模拟,首先最短路大小可以判断,就是横向和纵向的最大值,然后根据大小先斜着走,然后在上下左右走。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int max(int a, int b)
{
return a > b ? a : b;
}
int min(int a, int b)
{
return a < b ? a : b;
}
int main()
{
int i, j, m, n, ans, pre1, pre2, temp1, temp2, temp;
char a[2], b[2];
scanf("%s", a);
scanf("%s", b);
pre1 = b[0] - a[0];pre2 = b[1] - a[1];
temp1 = max(pre1, -pre1); temp2 = max(pre2, -pre2);
ans = max(temp1, temp2);
if (pre1 > 0 && pre2 > 0)
{
cout << ans << endl;
temp = min(temp1, temp2);
for (i = 1; i <= temp; i++)
cout << "RU" << endl;
if (temp1>temp2)
for (i = temp + 1; i <= temp1; i++)
cout << "R" << endl;
else
for (i = temp + 1; i <= temp2; i++)
cout << "U" << endl;
}
else if (pre1 > 0 && pre2 < 0)
{
cout << ans << endl;
temp = min(temp1, temp2);
for (i = 1; i <= temp; i++)
cout << "RD" << endl;
if (temp1>temp2)
for (i = temp + 1; i <= temp1; i++)
cout << "R" << endl;
else
for (i = temp + 1; i <= temp2; i++)
cout << "D" << endl;
}
else if (pre1 < 0 && pre2 < 0)
{
cout << ans << endl;
temp = min(temp1, temp2);
for (i = 1; i <= temp; i++)
cout << "LD" << endl;
if (temp1>temp2)
for (i = temp + 1; i <= temp1; i++)
cout << "L" << endl;
else
for (i = temp + 1; i <= temp2; i++)
cout << "D" << endl;
}
else if (pre1<0 && pre2>0)
{
cout << ans << endl;
temp = min(temp1, temp2);
for (i = 1; i <= temp; i++)
cout << "LU" << endl;
if (temp1>temp2)
for (i = temp + 1; i <= temp1; i++)
cout << "L" << endl;
else
for (i = temp + 1; i <= temp2; i++)
cout << "U" << endl;
}
if (pre1 == 0)
{
cout << ans << endl;
if (pre2>0)
for (i = 1; i <= temp2; i++)
cout << "U" << endl;
else
for (i = 1; i <= temp2; i++)
cout << "D" << endl;
}
else if (pre2 == 0&&pre1!=0)
{
cout << ans << endl;
if (pre1>0)
for (i = 1; i <= temp1; i++)
cout << "R" << endl;
else
for (i = 1; i <= temp1; i++)
cout << "L" << endl;
}
return 0;
}
但是这个方法太麻烦了,写了很多行,并不是题目的最优解。看了一下源代码,发现可以模拟这个人走的坐标,即每次移动改变字符串。 代码简单易懂,值得思考。
#include<cstring>
#include<string>
#include<iostream>
#include<cstdio>
using namespace std;
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
string a, b;
int i, j, m, n, ans, pre1, pre2;
cin >> a >> b;
pre1 = max(a[0] - b[0], b[0] - a[0]);
pre2 = max(a[1] - b[1], b[1] - a[1]);
ans = max(pre1, pre2);
cout << ans << endl;
while (a != b)
{
if (a[0] < b[0])
{
cout << "R";
a[0]++;
}
if (a[0]>b[0])
{
cout << "L";
a[0]--;
}
if (a[1] < b[1])
{
cout << "U";
a[1]++;
}
if (a[1]>b[1])
{
cout << "D";
a[1]--;
}
cout << endl;
}
return 0;
}