Computer >> Máy Tính >  >> Lập trình >> C ++

Lonely Pixel II trong C ++

Giả sử chúng ta có một bức ảnh bao gồm các pixel đen và trắng, chúng ta phải tìm số pixel đen có ở hàng R và cột C. Điều đó phù hợp với tất cả các quy tắc sau -

  • R và C sẽ chứa chính xác N pixel đen

  • Đối với tất cả các hàng có pixel màu đen ở cột C, chúng phải giống hệt như hàng R.

Ở đây, hình ảnh được thể hiện bằng một mảng ký tự 2D bao gồm 'B' và 'W', tương ứng cho các pixel đen và trắng.

Nếu đầu vào giống như -

W B W B B W
W B W B B W
W B W B B W
W W B W B W

Và N =3, thì đầu ra sẽ là 6. Bởi vì tất cả các chữ "B" in đậm là các điểm ảnh màu đen, tất cả các chữ "B ở cột 1 và 3. Bây giờ nếu chúng ta lấy" B "ở hàng R =0 và cột C =1 vì vậy, ví dụ:Quy tắc 1, hàng R =0 và cột C =1 đều có chính xác N 'B' pixel. và Quy tắc 2, các hàng có pixel ‘B’ tại cột C =1 là hàng 0, hàng 1 và hàng 2. Chúng hoàn toàn giống với hàng R =0.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • ret:=0

  • Xác định một bản đồ r một bản đồ khác c

  • n:=số hàng của p, m:=số cột của p

  • để khởi tạo i:=0, khi i

    • để khởi tạo j:=0, khi j

      • nếu p [i, j] giống với 'B' thì -

        • chèn j vào r [i]

        • chèn tôi vào c [j]

  • để khởi tạo i:=0, khi i

    • để khởi tạo j:=0, khi j

      • nếu p [i, j] giống với 'B' và kích thước của r [i] giống với N và kích thước của c [j] giống với N, thì -

        • ok:=true

        • đối với mỗi x trong c [j], thực hiện

          • nếu r [x] không bằng r [i] thì -

            • ok:=false

            • Ra khỏi vòng lặp

        • ret:=ret + ok

  • trả lại ret

Ví dụ (C ++)

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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));
}

Đầu vào

{{'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

Đầu ra

6