สมมติว่าเรามีบอร์ด N x N อันที่มีเพียง 0s และ 1s เท่านั้น ในการย้ายแต่ละครั้ง เราสามารถสลับ 2 แถวหรือ 2 คอลัมน์ใดก็ได้ เราต้องหาจำนวนการเคลื่อนไหวขั้นต่ำเพื่อเปลี่ยนกระดานให้เป็น "กระดานหมากรุก" หากไม่มีวิธีแก้ปัญหา ให้คืนค่า -1
ดังนั้นหากอินพุตเป็นแบบ −
| | | |
| | | |
| | | |
| | | |
จากนั้นผลลัพธ์จะเป็น 2 เนื่องจากสองคอลัมน์แรกในการย้ายครั้งแรก กระดานจะเป็นแบบนี้ -
| | | |
| | | |
| | | |
| | | |
จากนั้นสลับแถวที่สองและแถวที่ 3 -
| | | |
| | | |
| | | |
| | | |
นี่คือกระดานหมากรุก
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- n :=ขนาดของ b
- สำหรับการเริ่มต้น i :=0 เมื่อฉัน
- สำหรับการเริ่มต้น j :=0 เมื่อ j
- ถ้า b[0, 0] XOR b[0, j] XOR b[i, 0] XOR b[i, j] ไม่ใช่ศูนย์ ดังนั้น −
- คืน -1
- สำหรับการเริ่มต้น j :=0 เมื่อ j
- คืน -1
- คืน -1
- ถ้า colSwap mod 2 ไม่ใช่ศูนย์ ดังนั้น −
- colSwap :=n - colSwap
- ถ้า rowSwap mod 2 ไม่ใช่ศูนย์ ดังนั้น −
- rowSwap :=n - rowSwap
- colSwap :=ขั้นต่ำของ colSwap และ n - colSwap
- rowSwap :=ขั้นต่ำของ rowSwap และ n - rowSwap
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#includeใช้ namespace std;class Solution {public:int movesToChessboard(vector >&b) { int n =b.size(); for(int i =0; i > v ={{0,1,1,0},{0,1,1,0},{1,0,0,1},{1,0,0,1}}; cout <<(ob.movesToChessboard(v));}
อินพุต
<ก่อน>{{0,1,1,0},{0,1,1,0},{1,0,0,1},{1,0,0,1}};ผลลัพธ์
2