Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เวลาน้อยที่สุดในการเยี่ยมชมจุดทั้งหมดใน C++

ปัญหา

ได้รับจุดหลายจุดเป็นอาร์เรย์ หาเวลาน้อยที่สุด (วินาที) ในการเยี่ยมชมจุดทั้งหมด เงื่อนไข:

  • 1 วินาที เคลื่อนที่ได้: แนวตั้ง, แนวนอน, แนวทแยง
  • ต้องเยี่ยมชมตามลำดับในอาร์เรย์

เช่น Points = [(1,1), (3,4), (-1,0)] → Output = 7 เส้นทาง: (1,1)→(2,2)→(3,3)→(3,4)→(2,3)→(1,2)→(0,1)→(-1,0)

วิธีแก้

หา Max ของ |x2-x1| และ |y2-y1| ระหว่างจุดติดกัน รวม Max ทั้งหมด

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int minTimeToVisitAllPoints(vector<vector<int>>& p) {
        int ans = 0;
        int n = p.size();
        for (int i = 1; i < n; i++) {
            ans += max(abs(p[i][0] - p[i-1][0]), abs(p[i][1] - p[i-1][1]));
        }
        return ans;
    }
};

int main() {
    Solution ob;
    vector<vector<int>> c = {{1,1}, {3,4}, {-1,0}};
    cout << ob.minTimeToVisitAllPoints(c);
}

อินพุต

[[1,1],[3,4],[-1,0]]

เอาต์พุต

7

คำอธิบาย

การเคลื่อนที่แบบ Chebyshev Distance: ระยะทาง = max(|Δx|, |Δy|) เพราะเคลื่อนที่ทแยงได้ครอบคลุมทั้ง x และ y พร้อมกัน

จุด (1,1)→(3,4): Δx=2, Δy=3 → max=3

จุด (3,4)→(-1,0): Δx=4, Δy=4 → max=4

รวม = 3+4 = 7