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

เมทริกซ์พลิกสุ่มใน C++


สมมติว่าเรามีเมทริกซ์ไบนารีที่มีจำนวนแถว n_rows และจำนวนคอลัมน์ n_cols ในที่นี้ ค่าทั้งหมดเป็น 0 เริ่มต้น เราต้องกำหนดฟังก์ชัน flip() ซึ่งเลือกค่า 0 อย่างสม่ำเสมอโดยการสุ่ม เปลี่ยนเป็น 1 แล้วส่งกลับตำแหน่ง [row.id, col.id] ของค่านั้น นอกจากนี้ เราต้องเขียนฟังก์ชันอื่น reset() ซึ่งตั้งค่าทั้งหมดกลับเป็น 0 เราต้องพยายามลดจำนวนการเรียกไปยัง Math.random() ของระบบ และปรับความซับซ้อนของเวลาและพื้นที่ให้เหมาะสม

หากเรามีเมทริกซ์ของลำดับ 2x3 และเราเรียกการพลิกสี่ครั้ง ผลลัพธ์จะเป็น [0,1], [1,2], [1,0], [1,1]

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

  • สร้างแผนที่ที่เรียกว่าหลุม
  • ในตัวเริ่มต้น ให้ทำดังต่อไปนี้
  • เริ่มต้นตัวสร้างตัวเลขสุ่ม n :=จำนวนแถว m :=จำนวน cols
  • ขนาด :=n * ม.
  • ในวิธีพลิก ให้ทำดังต่อไปนี้ −
  • id :=ขนาดม็อดตัวเลขสุ่ม, ลดขนาดลง 1, กำจัด :=id
  • ถ้า id มีอยู่ในรู ดังนั้น id :=holes[id]
  • รู[กำจัด] :=รู[ขนาด] เมื่อขนาดเป็นรู มิฉะนั้นจะมีขนาด
  • คืนคู่ (id / m, id mod m)
  • ในวิธีการรีเซ็ต ให้ทำ
  • ขนาด :=n x m และเคลียร์รู

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

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   unordered_map <int, int> holes;
   int n;
   int m;
   int size;
   Solution(int n_rows, int n_cols) {
      srand(time(NULL));
      n = n_rows;
      m = n_cols;
      size = n * m;
   }
   vector<int> flip() {
      int id = rand() % size;
      size--;
      int rid = id;
      if(holes.count(id)){
         id = holes[id];
      }
      holes[rid] = holes.count(size) ? holes[size] : size;
      return {id / m, id % m};
   }
   void reset() {
      size = n * m;
      holes.clear();
   }
};
main(){
   Solution ob(2,2);
   print_vector(ob.flip());
   print_vector(ob.flip());
   print_vector(ob.flip());
   print_vector(ob.flip());
}

อินพุต

Initialize the constructor using 2,2 and call flip four times

ผลลัพธ์

[1, 1, ]
[0, 0, ]
[1, 0, ]
[0, 1, ]