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

กระโดดเกม IV ใน C++


สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มที่เรียกว่า arr เราอยู่ที่ดัชนี 0 ในขั้นตอนเดียว เราสามารถข้ามจากดัชนี i ไปยัง i + x โดยที่:i + x =0. j โดยที่:arr[i] และ arr[j] เหมือนกัน และ i และ j ไม่เหมือนกัน โดยที่ n คือขนาดของอาร์เรย์ เราต้องหาจำนวนขั้นตอนขั้นต่ำเพื่อให้ได้ดัชนีสุดท้ายของอาร์เรย์

ดังนั้นหากอินพุตเป็นแบบนั้น

กระโดดเกม IV ใน C++

จากนั้นผลลัพธ์จะเป็น 3 เราต้องกระโดดสามครั้งจากดัชนี 0 เป็น 4 เป็น 3 เป็น 9

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดหนึ่งแผนที่ m

  • n :=ขนาดของ arr

  • สำหรับการเริ่มต้น i :=0 เมื่อ i

    • ใส่ i ต่อท้าย m[arr[i]]

  • ใส่ i ต่อท้าย m[arr[i]]

  • ใส่ 0 เข้าไป

  • กำหนดหนึ่งคิว q

  • สำหรับการเริ่มต้น lvl :=0 เมื่อไม่มี q ว่าง ให้อัปเดต (เพิ่ม lvl ขึ้น 1), do−

    • sz :=ขนาดของ q

    • ในขณะที่ sz ไม่ใช่ศูนย์ ให้ลด sz ในการวนซ้ำแต่ละครั้ง 1 ทำ −

      • curr :=องค์ประกอบแรกของ q

      • ลบองค์ประกอบออกจาก q

      • ถ้า curr เหมือนกับ n - 1 แล้ว

        • กลับเลเวล

      • ผม :=สกุลเงิน

      • ถ้า i - 1>=0 และไม่ใช่ i - 1 อยู่ในการเยี่ยมชมแล้ว −

        • ใส่ i - 1 ลงใน q

        • ใส่ i - 1 เข้าไป

      • ถ้า i + 1

        • แทรก i + 1 ลงใน q

        • แทรก i + 1 ลงในการเยี่ยมชม

      • สำหรับการเริ่มต้น j :=0 เมื่อ j

        • ถ้า (m[arr[curr], j]) ไม่ได้เข้าเยี่ยม −

          • แทรก m[arr[curr], j] ลงใน q

          • แทรก m[arr[curr], j] เข้าไป

      • ถ้า arr[curr] ไม่อยู่ใน m แล้ว −

        • ลบ arr[curr] จาก m

  • กลับ -1

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int minJumps(vector<int>& arr) {
      map<int, vector<int> > m;
      int n = arr.size();
      for (int i = 0; i < n; i++) {
         m[arr[i]].push_back(i);
      }
      set<int> visited;
      visited.insert(0);
      queue<int> q;
      q.push(0);
      for (int lvl = 0; !q.empty(); lvl++) {
         int sz = q.size();
         while (sz--) {
            int curr = q.front();
            q.pop();
            if (curr == n - 1)
            return lvl;
            int i = curr;
            if (i - 1 >= 0 && !visited.count(i - 1)) {
               q.push(i - 1);
               visited.insert(i - 1);
            }
            if (i + 1 < n && !visited.count(i + 1)) {
               q.push(i + 1);
               visited.insert(i + 1);
            }
            for (int j = 0; j < m[arr[curr]].size(); j++) {
               if (!visited.count(m[arr[curr]][j])) {
                  q.push(m[arr[curr]][j]);
                  visited.insert(m[arr[curr]][j]);
               }
            }
            if (m.count(arr[curr])) {
               m.erase(arr[curr]);
            }
         }
      }
      return -1;
   }
};
main(){
   Solution ob;
   vector<int> v = {20,-5,-5,25,20,5,5,5,1,25};
   cout << (ob.minJumps(v));
}

อินพุต

{20,-5,-5,25,20,5,5,5,1,25}

ผลลัพธ์

3