สมมติว่าเรามีเมทริกซ์ไบนารีที่มีจำนวนแถว 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, ]