โจทย์: กำหนดอาร์เรย์ arr[] จุดพิกัดคือ (i, arr[i]) ตรวจสอบว่าจุดทั้งหมดอยู่บนสองเส้นตรงขนานได้หรือไม่
ตัวอย่าง: arr = {2,6,8,12,14} จุดอยู่บนสองเส้นขนาน เส้นแรก: (1,2), (3,8), (5,14) เส้นที่สอง: (2,6), (4,12)
วิธีแก้: เปรียบเทียบความชัน (slope) ของเส้นที่สร้างจากจุด สามจุดแรกต้องมีสองจุดอยู่เส้นเดียวกัน คำนวณ截距 (intercept) ถ้าได้ค่า intercept แตกต่างกันสองค่า = อยู่บนสองเส้นขนานได้
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
bool is_intercept(double slope, int arr[], int num) {
set<double> Lines;
for (int i = 0; i < num; i++)
Lines.insert(arr[i] - slope * (i));
return Lines.size() == 2;
}
bool is_parallel(int arr[], int num) {
bool slope1 = is_intercept(arr[1] - arr[0], arr, num);
bool slope2 = is_intercept(arr[2] - arr[1], arr, num);
bool slope3 = is_intercept((arr[2] - arr[0]) / 2.0, arr, num);
return (slope1 || slope2 || slope3);
}
int main() {
int arr[] = {2,6,8,12,14};
int num = sizeof(arr)/sizeof(arr[0]);
cout << (int)is_parallel(arr, num);
return 0;
}
ผลลัพธ์
1