建設(shè)個網(wǎng)站從哪里盈利其中包括
題目描述:
題目解讀:
給定移動規(guī)則以及起始點,終點;分析終點是否可達,可達則輸出最小步數(shù)。
解題思路:
首先要判定是否可達。畫圖可知,對于題目給定的移動規(guī)則,只能到達起始點(a,b)的第一象限和第二象限的上半部分。
因此對于輸入的終點(c,d),構(gòu)建判斷語句:如果(c,d)在(a,b)的三四象限,即 d>b,不可達。如果(c,d)在(a,b)的第二象限下半部分,即 c>a && d>=b && c-a>d-b 時,也不可達。
其余可達的點計算最小路徑。題目給定的移動方式是向左平移或者向右對角線移動。
我的思路是先走右對角到達終點同一高度(如果終點和起點y坐標相同則省略該步),然后左移即可。(這個思路是經(jīng)過計算的,即使終點在起點的第一象限,先到右對角線再左移 和 先向左移然后通過·右對角線不斷靠近,所需步數(shù)是一樣的。)
從(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。
代碼實現(xiàn):
//判斷能否按題目要求進行移動,能的話給出最小步數(shù)
#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;
}
遇到的錯誤:求解移動步數(shù)的時候容易卡殼。