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

จำนวนการดำเนินการขั้นต่ำเพื่อตั้งค่าองค์ประกอบทั้งหมดของเมทริกซ์ไบนารีใน C++


ข้อความโจทย์

กำหนดเมทริกซ์ไบนารีขนาด N แถว M คอลัมน์ การดำเนินการที่อนุญาตคือเลือกดัชนี (x, y) ใดๆ และสลับ (toggle) องค์ประกอบทั้งหมดในสี่เหลี่ยมผืนผ้าที่มุมซ้ายบนคือ (0, 0) และมุมขวาล่างคือ (x-1, y-1) การสลับหมายถึงการเปลี่ยน 1 เป็น 0 และ 0 เป็น 1 งานคือหาจำนวนการดำเนินการขั้นต่ำเพื่อให้องค์ประกอบทั้งหมดของเมทริกซ์เป็น 1

ตัวอย่าง

หากเมทริกซ์นำเข้าเป็น {0, 0, 0, 1, 1}    {0, 0, 0, 1, 1}    {0, 0, 0, 1, 1}    {1, 1, 1, 1, 1}    {1, 1, 1, 1, 1} คำตอบคือ 1

ในหนึ่งการเคลื่อนที่ ให้เลือก (3, 3) เพื่อทำให้เมทริกซ์ทั้งหมดประกอบด้วย 1 เท่านั้น

อัลกอริทึม

แนวคิดคือเริ่มจากจุดสิ้นสุด (N-1, M-1) และวนลูปเมทริกซ์ในลำดับย้อนกลับ ทุกครั้งที่พบเซลล์ที่มีค่า 0 ให้สลับมัน

ตัวอย่าง

#include <iostream> #define ROWS 5 #define COLS 5 using namespace std; int getMinOperations(bool arr[ROWS][COLS]) {     int ans = 0;     for (int i = ROWS - 1; i >= 0; i--) {       for (int j = COLS - 1; j >= 0; j--) {           if (arr[i][j] == 0) {             ans++;             for (int k = 0; k <= i; k++) {                 for (int h = 0; h <= j; h++) {                   if (arr[k][h] == 1)                       arr[k][h] = 0;                   else                       arr[k][h] = 1;                 }             }           }       }     }     return ans; } int main() {     bool mat[ROWS][COLS] = {       0, 0, 1, 1, 1,       0, 0, 0, 1, 1,       0, 0, 0, 1, 1,       1, 1, 1, 1, 1,       1, 1, 1, 1, 1     };     cout << "Minimum required operations = " << getMinOperations(mat) << endl;     return 0; }

ผลลัพธ์

เมื่อคอมไพล์และรันโปรแกรมข้างต้น จะได้ผลลัพธ์ดังนี้

Minimum required operations = 3