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

สร้างเมทริกซ์ไบนารี 2 แถวใหม่ใน C ++


สมมติว่าเรามีรายละเอียดของเมทริกซ์ที่มี n คอลัมน์และ 2 แถว -

  • องค์ประกอบเมทริกซ์จะเป็น 0 หรือ 1
  • ผลรวมขององค์ประกอบของแถวที่ 0 (บน) ถูกกำหนดไว้ด้านบน
  • ผลรวมขององค์ประกอบของแถวที่ 1 (ล่าง) มีค่าน้อยกว่า
  • ผลรวมขององค์ประกอบในคอลัมน์ i-th(0-indexed) คือ colsum[i] โดยที่ colsum ถูกกำหนดเป็นอาร์เรย์จำนวนเต็มโดยมีความยาว n

ภารกิจคือการสร้างเมทริกซ์ขึ้นใหม่ด้วยบน ล่าง และโคลซัม เราต้องหามันเป็นอาร์เรย์จำนวนเต็ม 2 มิติ หากมีวิธีแก้ไขที่ถูกต้องมากกว่าหนึ่งวิธี จะยอมรับวิธีใดวิธีหนึ่ง หากไม่มีวิธีแก้ปัญหาที่ถูกต้อง ให้ส่งคืนอาร์เรย์ 2D ที่ว่างเปล่า ดังนั้นหากอินพุตเป็นเหมือน upper =2, lower =3 และ colsum เป็น [1,1,1] เอาต์พุตจะเป็น [[1,1,0],[0,0,1]]

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

  • set flag :=true, n :=size of c สร้างหนึ่งอาร์เรย์ตามลำดับ 2 * n
  • สำหรับฉันอยู่ในช่วง 0 ถึง n
    • ถ้า c[i] =2 แล้ว
      • ลด u และ l ลง 1
      • ถ้าคุณ <0 หรือ l <0 ให้ตั้งค่าสถานะ :=false
      • ใส่ ans[0, i] =1 และ ans[1, i] =1
    • อย่างอื่นถ้า c[i] =1 แล้ว
      • ถ้า u> l แล้วลด u ลง 1, ans[0, i] :=1
      • มิฉะนั้น เมื่อ u
      • มิฉะนั้น เมื่อ c[i] =1
      • ถ้า u> 0 ให้ลด u ลง 1 และ ans[0, i] :=1
      • มิฉะนั้น l> 0 จากนั้นลด l ขึ้น 1 และ ans[1, i] :=1
      • มิฉะนั้น ตั้งค่าสถานะ :=false
    • มิฉะนั้น c[i] =0
      • ถ้า c[i]> 0 ให้ตั้งค่าสถานะ :=false
    • มิฉะนั้น ตั้งค่าสถานะ :=false
  • ถ้าแฟล็กเป็นเท็จหรือ u ไม่ใช่ 0 หรือ l ไม่ใช่ 0 ให้คืนค่าว่าง
  • คืนสินค้า

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

ตัวอย่าง

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

อินพุต

2
1
[1,1,1]

ผลลัพธ์

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