# 題目: UVa 10642 - Can You Solve It
# 題目說明
給一個平面座標的移動規則(0, 0)
-> (0, 1)
-> (1, 0)
-> (0, 2)
-> (1, 1)
-> (2, 0)
-> (0, 3)
... 以此類推
求初始座標 (x1, y1)
與目的座標 (x2, y2)
的距離
INPUT:
第一行輸入一個整數 t
,代表測資數
接下來有 t
行,每行有 4
個整數 x1
、 y1
、 x2
、 y2
,代表初始座標 (x1, y1)
與目的座標 (x2, y2)
OUTPUT:
輸出從初始座標 (x1, y1)
到目的座標 (x2, y2)
的距離
# 解題方法
使用一個變數 cnt
紀錄距離
先將初始座標 (x1, y1)
移至 y軸
上,也就是 x1
歸零, cnt
減去移動的距離
再將目的座標 (x2, y2)
移至 y軸
上,也就是 x2
歸零, cnt
加上移動的距離
最後再算 (0, y1)
到 (0, y2)
的距離,公式為 y1 + 1
累加至 y2
假設現在要從 (1, 2)
移動到 (3, 4)
將初始座標 (1, 2)
往左移變成 (0, 3)
, cnt
為 0 - 1 = -1
將目的座標 (3, 4)
往左移 3
次,變成 (0, 7)
, cnt
為 -1 + 3 = 2
現在問題變成要將 (0, 3)
移動到 (0, 7)
,按照公式需要加 4, 5, 6, 7
,所以 cnt
為 2 + 4 + 5 + 6 + 7 = 24
# 參考程式碼
#include <iostream> | |
using namespace std; | |
static auto fast_io = [] | |
{ | |
ios::sync_with_stdio(false); | |
cout.tie(nullptr); | |
cin.tie(nullptr); | |
return 0; | |
}(); | |
int main() | |
{ | |
int t, x1, y1, x2, y2; | |
int Case = 0; | |
cin >> t; | |
while (t--) | |
{ | |
int cnt = 0; | |
cin >> x1 >> y1 >> x2 >> y2; | |
while (x1) --x1, ++y1, --cnt; | |
while (x2) --x2, ++y2, ++cnt; | |
for (int i = y1 + 1; i <= y2; ++i) cnt += i; | |
cout << "Case " << ++Case << ": " << cnt << "\n"; | |
} | |
} |