题目描述:
题目解读:
给定移动规则以及起始点,终点;分析终点是否可达,可达则输出最小步数。
解题思路:
首先要判定是否可达。画图可知,对于题目给定的移动规则,只能到达起始点(a,b)的第一象限和第二象限的上半部分。
因此对于输入的终点(c,d),构建判断语句:如果(c,d)在(a,b)的三四象限,即 d>b,不可达。如果(c,d)在(a,b)的第二象限下半部分,即 c>a && d>=b && c-a>d-b 时,也不可达。
其余可达的点计算最小路径。题目给定的移动方式是向左平移或者向右对角线移动。
我的思路是先走右对角到达终点同一高度(如果终点和起点y坐标相同则省略该步),然后左移即可。(这个思路是经过计算的,即使终点在起点的第一象限,先到右对角线再左移 和 先向左移然后通过·右对角线不断靠近,所需步数是一样的。)
从(a,b)到(c,d),先走右对角线,到达(a+d-b,d),然后向左移动到(c,d)即可。
到达(a+d-b,d)需要d-b步,移动到(c,d)需a+d-b-c步,共需要d-b+a+d-b-c。
代码实现:
//判断能否按题目要求进行移动,能的话给出最小步数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Solve() {
int a,b,c,d;
scanf("%d%d%d%d", &a,&b,&c,&d);
if (b>d || (c>a && d>=b && c-a>d-b)){
printf("%d\n",-1);
}
else printf("%d\n", (d-b)+ (a+d-b)-c );
return;
}
int main() {
int t;
scanf("%d", &t);
while (t--) Solve();
return 0;
}
遇到的错误:求解移动步数的时候容易卡壳。