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

Tạo lại ma trận nhị phân 2 hàng trong C ++

Giả sử chúng ta có các chi tiết sau của một ma trận có n cột và 2 hàng -

  • Các phần tử của ma trận sẽ là 0 hoặc 1
  • Tổng các phần tử của hàng 0 (trên) được cho là trên.
  • Tổng các phần tử của hàng 1 (thấp hơn) được cho là thấp hơn.
  • Tổng các phần tử trong cột thứ i (được lập chỉ mục 0) là colsum [i], trong đó colsum được cung cấp dưới dạng một mảng số nguyên có độ dài n.

Nhiệm vụ là xây dựng lại ma trận với trên, dưới và cột. Chúng ta phải tìm nó dưới dạng một mảng số nguyên 2D. Nếu có nhiều hơn một giải pháp hợp lệ, bất kỳ giải pháp nào trong số chúng sẽ được chấp nhận. Nếu không có giải pháp hợp lệ, hãy trả về một mảng 2D trống. Vì vậy, nếu đầu vào là upper =2, Lower =3 và colsum là [1,1,1], thì đầu ra sẽ là [[1,1,0], [0,0,1]]

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

  • set flag:=true, n:=size of c, tạo một mảng ans có thứ tự 2 * n
  • cho tôi trong phạm vi từ 0 đến n
    • nếu c [i] =2, thì
      • giảm u và l đi 1
      • nếu u <0 hoặc l <0, thì flag:=false
      • đặt ans [0, i] =1 và ans [1, i] =1
    • else nếu c [i] =1, thì
      • nếu u> l, sau đó giảm u đi 1, ans [0, i]:=1
      • ngược lại khi u
      • ngược lại khi c [i] =1
      • nếu u> 0, sau đó giảm u đi 1 và ans [0, i]:=1
      • nếu không thì l> 0, sau đó giảm l đi 1 và ans [1, i]:=1
      • nếu không, hãy đặt cờ:=false
    • nếu không thì c [i] =0
      • nếu c [i]> 0, thì hãy đặt cờ:=false
    • nếu không, hãy đặt cờ:=false
  • nếu cờ sai hoặc u không phải 0 hoặc l không phải 0, thì trả về trống
  • trả lại ans

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

Ví dụ

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto> > v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<vector<int>> reconstructMatrix(int u, int l, vector<int>& c) {
      bool flag = true;
      int n = c.size();
      vector < vector <int> > ans(2, vector <int> (n));
      for(int i = 0; i < n; i++){
         if(c[i] == 2){
            u--;
            l--;
            if(u<0 || l<0)flag = false;
            ans[0][i] = 1;
            ans[1][i] = 1;
         }else if(c[i] == 1){
            if(u>l){
                  u--;
                  ans[0][i] = 1;
            }else if(u<l){
               l--;
               ans[1][i] = 1;
            }else{
               if(u>0){
                  u--;
                  ans[0][i] = 1;
               }else if(l > 0){
                  l--;
                  ans[1][i] = 1;
               }else
                  flag = false;
            }  
         }else if(c[i] == 0){
         if(c[i]>0)flag = false;
         }else{
            flag = false;
         }
      }
      if(!flag || u!=0 ||l!=0 )return {};
      return ans;
   }
};
main(){
   vector<int> v = {1,1,1};
   Solution ob;
   print_vector(ob.reconstructMatrix(2,1,v));
}

Đầu vào

2
1
[1,1,1]

Đầu ra

[[1, 1, 0, ],[0, 0, 1, ],]