สมมติว่าเรามีเมทริกซ์ไบนารี N X M สองตัว A และ B ในการดำเนินการเดียว เราสามารถเลือกเมทริกซ์ย่อย (อย่างน้อย 2x2) และแปลงความเท่าเทียมกันขององค์ประกอบมุม (flip bits) สุดท้ายเราต้องตรวจสอบว่าเมทริกซ์ A สามารถแปลงเป็น B ได้หรือไม่ด้วยการดำเนินการจำนวนเท่าใดก็ได้
ดังนั้นหากอินพุตเป็นแบบ
1 | 0 | 0 |
1 | 0 | 1 |
1 | 0 | 0 |
จากนั้นผลลัพธ์จะเป็น True เนื่องจากเราสามารถดำเนินการกับเมทริกซ์ย่อยสี่เหลี่ยมด้านซ้ายบนของขนาด (2x2) บน mat1 เพื่อรับ mat2
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- row :=จำนวนแถวของ mat1
- column :=จำนวนคอลัมน์ของ mat1
- สำหรับฉันในช่วง 1 ถึงแถว - 1 ทำ
- สำหรับ j ในช่วง 1 ถึงคอลัมน์ - 1 ทำ
- ถ้า mat1[i, j] ไม่เหมือนกับ mat2[i, j] แล้ว
- mat1[i, j] :=mat1[i, j] XOR 1
- mat1[0, 0] :=mat1[0, 0] XOR 1
- mat1[0, j] :=mat1[0, j] XOR 1
- mat1[i, 0] :=mat1[i, 0] XOR 1
- ถ้า mat1[i, j] ไม่เหมือนกับ mat2[i, j] แล้ว
- สำหรับ j ในช่วง 1 ถึงคอลัมน์ - 1 ทำ
- สำหรับฉันในช่วง 0 ถึงแถว - 1 ทำ
- สำหรับ j ในช่วง 0 ถึงคอลัมน์ - 1 ทำ
- ถ้า mat1[i, j] ไม่เหมือนกับ mat2[i, j] แล้ว
- คืนค่าเท็จ
- ถ้า mat1[i, j] ไม่เหมือนกับ mat2[i, j] แล้ว
- สำหรับ j ในช่วง 0 ถึงคอลัมน์ - 1 ทำ
- คืนค่า True
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def dissolve(mat1, mat2):row =len(mat1) column =len(mat1[0]) for i in range(1, row):for j in range(1, column):if mat1[i] ][j] !=mat2[i][j]:mat1[i][j] ^=1 mat1[0][0] ^=1 mat1[0][j] ^=1 mat1[i][0 ] ^=1 สำหรับฉันในช่วง (แถว):สำหรับ j ในช่วง (คอลัมน์):ถ้า mat1[i][j] !=mat2[i][j]:ส่งคืนค่าเท็จ Truemat1 =[ [1, 0, 0 ], [1, 0, 1], [1, 0, 0]]mat2 =[ [0, 1, 0], [0, 1, 1], [1, 0, 0]]พิมพ์(แก้ไข(mat1 , mat2))
อินพุต
<ก่อนหน้า>[ [1, 0, 0], [1, 0, 1], [1, 0, 0]],[ [0, 1, 0], [0, 1, 1], [1, 0 , 0]]ผลลัพธ์
จริง