題目敘述
每筆測資第一行有一個正整數N,接下來會有N行,每行會有四個正整數,分別代表起點和終點的x和y座標。根據笛卡爾坐標系,需要按照以下所示的箭頭路徑從一個圓圈移動到另一個圓圈。
例如,要從 (0, 3) 到 (3, 0),您必須經過兩個中間圓 (1, 2) 和 (2, 1)。 所以,在這種情況下,所需的總步數是 2 + 1 = 3。
範例輸入 #1
3
0 0 0 1
0 0 1 0
0 0 0 2
範例輸出 #1
Case 1: 1
Case 2: 2
Case 3: 3
解題思路
如果把步數標出來的話,可以發現Y軸 (橫軸) 的步數是 0 --> 1 --> 3 --> 5 --> 9,以此類推。舉例來說,當x+y等於2的時候,可以發現這些點都落在 (0, 2) 這個點的斜線上,更可以發現 (1, 1) 這個點是 (0, 2) 的步數+1,也就是其x座標。同理,(2, 0) 的步數就是 (0, 2) 的步數+2。
可以先設定一個陣列,並將 0、1、3、6、10...等數字存放到Y座標 (橫軸) 的位置上。收資料的時候判斷x+y是多少就找這個位置的步數然後加上x座標的值。
解題程式碼如下 (僅供參考):
#include <iostream>
#include <vector>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
vector<long long int>Chueh;
long long int count = 0, add = 0;
for (int i = 0; i<=200000; i++)
{
count += add;
Chueh.push_back(count);
add++;
}
int N;
cin >> N;
for (int i = 0; i<N; i++)
{
long long int a, b;
cin >> a >> b;
long long int start = Chueh[a+b] + a;
cin >> a >> b;
long long int finish = Chueh[a+b] + a;
cout << "Case " << i+1 << ": " << finish-start << "\n";
}
}
留言
張貼留言