1. 程式人生 > 其它 >CF1428A Box is Pull 題解

CF1428A Box is Pull 題解

CF1428A Box is Pull 題解

Content

有一個兔子拖著一個盒子在走,每秒鐘可以帶著盒子走一個單位,也可以不帶著盒子走一個單位。當且僅當兔子和盒子的距離不超過 \(1\) 時可以帶著盒子走一個單位。現給出 \(t\) 次詢問,每次詢問給出四個整數 \(x_1,y_1,x_2,y_2\),試求出將盒子從 \((x_1,y_1)\) 拖到 \((x_2,y_2)\) 最少需要多少秒。

資料範圍:\(1\leqslant t\leqslant 1000,1\leqslant x_1,y_1,x_2,y_2\leqslant 10^9\)

Solution

謹以此紀念本人的第一場 CF。

我們根據三個情況來分類討論:

  1. \(x_1=x_2\)
    ,此時直接向平行於 \(y\) 軸的方向移動即可,答案就是 \(|y_1-y_2|\)
  2. \(y_1=y_2\),此時直接向平行於 \(x\) 軸的方向移動即可,答案就是 \(|x_1-x_2|\)
  3. \(x_1\neq x_2\)\(y_1\neq y_2\),此時先往一個方向走,再轉到另一個方向去走,由題目可知,轉向需要讓兔子先移動 \(2\) 個單位,所以答案就是 \(|x_1-x_2|+|y_1-y_2|+2\)

直接根據每個情況輸出答案即可。

Code

int t, x1, y1, x2, y2;

int main() {
	getint(t);
	while(t--) {
		int ans = 0;
		getint(x1), getint(y1), getint(x2), getint(y2);
		if(x1 == x2)		ans = abs(y1 - y2);
		else if(y1 == y2)	ans = abs(x1 - x2);
		else	ans = abs(x1 - x2) + abs(y1 - y2) + 2;
		writeint(ans), puts("");
	}	
	return 0;
}