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

พิกเซลโดด II ใน C++


สมมติว่าเรามีภาพที่ประกอบด้วยพิกเซลสีดำและขาว เราต้องหาจำนวนพิกเซลสีดำที่อยู่ที่แถว R และคอลัมน์ C ซึ่งสอดคล้องกับกฎต่อไปนี้:

  • แถว R และคอลัมน์ C ต้องมีพิกเซลสีดำทั้งหมด N ตัว

  • สำหรับทุกแถวที่มีพิกเซลสีดำที่คอลัมน์ C พวกเขาต้องเหมือนกับแถว R ทุกประการ

ภาพถูกแทนด้วยอาร์เรย์ 2D ของตัวอักษร 'B' และ 'W' สำหรับพิกเซลสีดำและขาวตามลำดับ

ถ้าอินพุตเป็นดังนี้:

WBWBBW
WBWBBW
WBWBBW
WWBWBW

และ N = 3 ผลลัพธ์จะเป็น 6 เพราะพิกเซล 'B' ที่เป็นตัวหนาทั้งหมดคือพิกเซลสีดำที่คอลัมน์ 1 และ 3 ถ้าเราเลือก 'B' ที่แถว R = 0 และคอลัมน์ C = 1 ตัวอย่างเช่น: กฎที่ 1 แถว R = 0 และคอลัมน์ C = 1 ทั้งคู่มีพิกเซล 'B' อย่างแม่นยำ N ตัว และกฎที่ 2 แถวที่มีพิกเซล 'B' ที่คอลัมน์ C = 1 คือแถว 0, 1 และ 2 พวกเขาเหมือนกับแถว R = 0 ทุกประการ

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

  • ret := 0

  • กำหนดแมป r และแมป c

  • n := จำนวนแถวของ p, m := จำนวนคอลัมน์ของ p

  • ลูป i จาก 0 ถึง n-1:

    • ลูป j จาก 0 ถึง m-1:

      • ถ้า p[i][j] เป็น 'B' ให้:

        • เพิ่ม j เข้า r[i]

        • เพิ่ม i เข้า c[j]

  • ลูป i จาก 0 ถึง n-1:

    • ลูป j จาก 0 ถึง m-1 และ i อยู่ใน r:

      • ถ้า p[i][j] เป็น 'B' และขนาดของ r[i] เท่ากับ N และขนาดของ c[j] เท่ากับ N ให้:

        • ok := true

        • สำหรับแต่ละ x ใน c[j] ให้ทำ:

          • ถ้า r[x] ไม่เท่ากับ r[i] ให้:

            • ok := false

            • ออกจากลูป

        • ret := ret + ok

  • คืนค่า ret

ตัวอย่าง (C++)

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

#include <bits/stdc++.h> using namespace std; class Solution { public:    int findBlackPixel(vector<vector<char>>& p, int N) {       int ret = 0;       unordered_map <int, set <int> > r, c;       int n = p.size();       int m = p[0].size();       for(int i = 0; i < n; i++){          for(int j = 0; j < m; j++){             if(p[i][j] == 'B'){                r[i].insert(j);                c[j].insert(i);             }          }       }       for(int i = 0; i < n; i++){          for(int j = 0; j < m && r.count(i); j++){             if(p[i][j] == 'B' && r[i].size() == N && c[j].size() == N){                bool ok = true;                for(auto& x : c[j]){                   if(r[x] != r[i]){                      ok = false;                      break;                   }                }                ret += ok;             }          }       }       return ret;    } }; main(){    Solution ob;    vector<vector<char>> v = {{'W','B','W','B','B','W'},{'W','B','W','B','B','W'},{'W','B','W','B' ,'B','W'},{'W','W','B','W','B','W'}};    cout << (ob.findBlackPixel(v, 3)); }

อินพุต

{{'W','B','W','B','B','W'},{'W','B','W','B','B','W'},{'W','B','W','B' ,'B','W'},{'W','W','B','W','B','W'}}, 3

เอาต์พุต

6