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

ค้นหาว่าเป็นไปได้หรือไม่ที่จะถึงจุดสิ้นสุดผ่านช่วงการเปลี่ยนภาพที่กำหนดใน C++


สมมติว่าเรามี n จุดบนแกน x และรายการการแปลที่อนุญาตระหว่างจุดต่างๆ ค้นหาว่าเป็นไปได้ที่จะถึงจุดสิ้นสุดจากจุดเริ่มต้นผ่านธุรกรรมเหล่านี้เท่านั้น ดังนั้นหากมีการแปลระหว่างจุด x1 และ x2 เราก็สามารถย้ายจากจุด x ไปยังจุดกลางใดๆ ระหว่าง x1 และ x2 หรือโดยตรงไปที่ x2 ดังนั้นถ้า n =5 และธุรกรรมคือ 0 ถึง 2, 2 ถึง 4 และ 3 ถึง 5 ผลลัพธ์จะเป็น YES มีเส้นทางตั้งแต่ 0→2→3→5

เราต้องเรียงลำดับรายการตามองค์ประกอบแรกของคู่ จากนั้นเริ่มจากคู่ที่สองของรายการและตรวจสอบว่าองค์ประกอบแรกของคู่อยู่ระหว่างองค์ประกอบที่สองของคู่ก่อนหน้าและองค์ประกอบที่สองของคู่ปัจจุบันหรือไม่ เงื่อนไขนี้ใช้เพื่อตรวจสอบว่ามีเส้นทางระหว่างสองคู่ที่ต่อเนื่องกันหรือไม่ ในตอนท้ายเราจะตรวจสอบว่าจุดที่เราไปถึงคือจุดปลายทางหรือไม่และจุดเริ่มต้นที่เราได้เริ่มต้นคือจุดเริ่มต้น ถ้าใช่ ให้แสดง YES มิฉะนั้น ให้แสดง NO

ตัวอย่าง

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
bool isPathPairFound(int n, vector<pair<int, int> > array) {
   sort(array.begin(),array.end());
   int start_point = array[0].first;
   int end_point=array[0].second;
   for (int i=1; i<n; i++) {
      if (array[i].first > end_point)
         break;
      end_point=max(end_point,array[i].second);
   }
   return (n <= end_point && start_point==0);
}
int main() {
   vector<pair<int, int> > array;
   array.push_back(make_pair(0,2));
   array.push_back(make_pair(2,4));
   array.push_back(make_pair(3,5));
   if (isPathPairFound(5,array))
      cout << "Path has found";
   else
      cout << "NO Path has found";
}

ผลลัพธ์

Path has found