Check if it is possible to create a matrix such that every row has A 1s and every column has B 1s

Given four integers N, M, A, B where N is the number of rows and M is the number of columns, the task is to check if is possible to create a binary matrix of dimensions N x M such that every row has A number of 1s and every column has a B number of 1s. If any such matrix is possible then print it else print “-1”.

Examples:

Input: N = 3, M = 6, A = 2, B = 1
Output: 
1 1 0 0 0 0
0 0 1 1 0 0
0 0 0 0 1 1
Explanation:
Every row has A ones i.e. 2 and every column has B ones i.e., 1.

Input: N = 2, M = 2, A = 2, B = 1
Output: No
Explanation:
It is not possible to create such a 2 x 2 matrix in which every row has 2 ones and every column has 1 ones because of the following two observations:
1. For every row place two ones because of which we will never be able to have one 1 in every column.
1 1         
1 1

2. For every column place one 1 because of which we can never have 2 ones in every row.         
1 0         
0 1 

Approach: The idea is to observe that since each row should have exactly A 1s, and each column should have exactly B 1s, hence the number of ones in all rows A * N should be equal to the number of 1s in all columns B * M. Thus, the desired matrix exists if and only if A*N = B*M. Below is the illustration:



  1. Find any number 0 < d < M such that (d * N)%M == 0, where A % B is the remainder of dividing A by B.
  2. In the first row of the desired matrix, insert the ones at the positions [1, A].
  3. In the ith row, put the ones, as in the i – 1 row, but cyclically shifted by d to the right.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Number of rows
const int n = 3;
  
// Number of columns
const int m = 6;
  
// Function that prints the matrix
// if it exists
void printMatrix(int arr[][m],
                 string ans)
{
    if (ans == "No")
        cout << "No\n";
    else {
        // Print if matrix exists
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++)
                cout << arr[i][j] << " ";
            cout << '\n';
        }
    }
}
  
// Function to check if it is possible
// to create a matrix such that every
// row has A 1s & every column has B 1s
void createMatrix(int a, int b)
{
    int matrix[n][m], row[n], col[m];
  
    // Initialize all matrix
    // entries equal to 0
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            matrix[i][j] = 0;
        }
    }
  
    // Initialize the number of
    // ones required in every row
    for (int i = 0; i < n; i++)
        row[i] = a;
  
    // Initialize the number of
    // ones required in each column
    for (int i = 0; i < m; i++)
        col[i] = b;
  
    int l = 0, d = 0;
  
    // Check if the total number of
    // ones required in every row is
    // not equal to total number of
    // ones required in every column
    // then print No
    if (n * a != m * b)
        printMatrix(matrix, "No");
  
    else {
  
        for (int i = 0; i < n; i++) {
            int j;
            if (l == m)
                l = 0;
  
            for (j = l; j < m; j++) {
  
                if (row[i] > 0 && col[j] > 0) {
  
                    // Fill a one if there is a
                    // place to be filled
                    matrix[i][j] = 1;
  
                    // Decrease the number of
                    // ones required in ith row
                    row[i]--;
  
                    // Decrease the number of
                    // ones required in jth column
                    col[j]--;
                    d = j;
                }
            }
            l = d + 1;
            if (row[i] != 0) {
  
                for (j = 0; j < m; j++) {
  
                    if (row[i] > 0 && col[j] > 0) {
  
                        // Fill a one if there is
                        // a place to be filled
                        matrix[i][j] = 1;
  
                        // Decrease the number of 1s
                        // required in ith row
                        row[i]--;
                        // Decrease the number of 1s
                        // required in jth column
                        col[j]--;
                        l = j + 1;
                    }
                    // Break the loop if no place
                    // is left for ones to filled
                    if (row[i] == 0)
                        break;
                }
            }
        }
  
        // Function call to print the matrix
        printMatrix(matrix, "Yes");
    }
}
  
// Driver Code
int main()
{
  
    // Number of ones required
    // in every row
    int a = 2;
  
    // Number of ones required
    // in every column
    int b = 1;
  
    // Function call
    createMatrix(a, b);
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for the above approach
import java.util.*;
  
class GFG{
  
// Number of rows
static int n = 3;
  
// Number of columns
static int m = 6;
  
// Function that prints the matrix
// if it exists
static void printMatrix(int arr[][],
                        String ans)
{
    if (ans == "No")
        System.out.print("No\n");
    else 
    {
          
        // Print if matrix exists
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m; j++)
                System.out.print(arr[i][j] + " ");
            System.out.println();
        }
    }
}
  
// Function to check if it is possible
// to create a matrix such that every
// row has A 1s & every column has B 1s
static void createMatrix(int a, int b)
{
    int [][]matrix = new int[n][m];
    int []row = new int[n]; 
    int []col = new int[m];
  
    // Initialize all matrix
    // entries equal to 0
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            matrix[i][j] = 0;
        }
    }
  
    // Initialize the number of
    // ones required in every row
    for(int i = 0; i < n; i++)
        row[i] = a;
  
    // Initialize the number of
    // ones required in each column
    for(int i = 0; i < m; i++)
        col[i] = b;
  
    int l = 0, d = 0;
  
    // Check if the total number of
    // ones required in every row is
    // not equal to total number of
    // ones required in every column
    // then print No
    if (n * a != m * b)
        printMatrix(matrix, "No");
  
    else 
    {
        for(int i = 0; i < n; i++)
        {
            int j;
            if (l == m)
                l = 0;
  
            for(j = l; j < m; j++)
            {
                if (row[i] > 0 && col[j] > 0)
                {
                      
                    // Fill a one if there is a
                    // place to be filled
                    matrix[i][j] = 1;
  
                    // Decrease the number of
                    // ones required in ith row
                    row[i]--;
  
                    // Decrease the number of
                    // ones required in jth column
                    col[j]--;
                    d = j;
                }
            }
            l = d + 1;
            if (row[i] != 0)
            {
                for(j = 0; j < m; j++)
                {
                    if (row[i] > 0 && col[j] > 0
                    {
                          
                        // Fill a one if there is
                        // a place to be filled
                        matrix[i][j] = 1;
  
                        // Decrease the number of 1s
                        // required in ith row
                        row[i]--;
                        // Decrease the number of 1s
                        // required in jth column
                        col[j]--;
                        l = j + 1;
                    }
                      
                    // Break the loop if no place
                    // is left for ones to filled
                    if (row[i] == 0)
                        break;
                }
            }
        }
  
        // Function call to print the matrix
        printMatrix(matrix, "Yes");
    }
}
  
// Driver Code
public static void main(String[] args)
{
  
    // Number of ones required
    // in every row
    int a = 2;
  
    // Number of ones required
    // in every column
    int b = 1;
  
    // Function call
    createMatrix(a, b);
}
}
  
// This code is contributed by amal kumar choubey
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program for the above approach
  
# Number of rows
n = 3
  
# Number of columns
m = 6
  
# Function that prints the matrix
# if it exists
def printMatrix(arr, ans):
      
    if (ans == "No"):
        print("No")
      
    else:
          
        # Print if matrix exists
        for i in range(n):
            for j in range(m):
                print(arr[i][j], end = " ")
                  
            print()
  
# Function to check if it is possible
# to create a matrix such that every
# row has A 1s & every column has B 1s
def createMatrix(a, b):
      
    matrix = [[0 for i in range(m)]
                 for i in range(n)]
    row = [a for i in range(n)]
    col = [b for i in range(m)]
  
    l = 0
    d = 0
  
    # Check if the total number of
    # ones required in every row is
    # not equal to total number of
    # ones required in every column
    # then prNo
    if (n * a != m * b):
        printMatrix(matrix, "No")
  
    else:
        for i in range(n):
            j = 0
              
            if (l == m):
                l = 0
  
            for j in range(l, m):
                if (row[i] > 0 and col[j] > 0):
  
                    # Fill a one if there is a
                    # place to be filled
                    matrix[i][j] = 1
  
                    # Decrease the number of
                    # ones required in ith row
                    row[i] -= 1
  
                    # Decrease the number of
                    # ones required in jth column
                    col[j] -= 1
                    d = j
  
            l = d + 1
            if (row[i] != 0):
                for j in range(m):
                    if (row[i] > 0 and col[j] > 0):
  
                        # Fill a one if there is
                        # a place to be filled
                        matrix[i][j] = 1
  
                        # Decrease the number of 1s
                        # required in ith row
                        row[i] -= 1
                          
                        # Decrease the number of 1s
                        # required in jth column
                        col[j] -= 1
                        l = j + 1
  
                    # Break the loop if no place
                    # is left for ones to filled
                    if (row[i] == 0):
                        break
  
        # Function call to prthe matrix
        printMatrix(matrix, "Yes")
  
# Driver Code
if __name__ == '__main__':
  
    # Number of ones required
    # in every row
    a = 2
  
    # Number of ones required
    # in every column
    b = 1
  
    # Function call
    createMatrix(a, b)
  
# This code is contributed by mohit kumar 29
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program for the above approach
using System;
class GFG{
  
// Number of rows
static int n = 3;
  
// Number of columns
static int m = 6;
  
// Function that prints the matrix
// if it exists
static void printMatrix(int [,]arr,
                        String ans)
{
    if (ans == "No")
        Console.Write("No\n");
    else 
    {
          
        // Print if matrix exists
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m; j++)
                Console.Write(arr[i, j] + " ");
            Console.WriteLine();
        }
    }
}
  
// Function to check if it is possible
// to create a matrix such that every
// row has A 1s & every column has B 1s
static void createMatrix(int a, int b)
{
    int [,]matrix = new int[n, m];
    int []row = new int[n]; 
    int []col = new int[m];
  
    // Initialize all matrix
    // entries equal to 0
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            matrix[i, j] = 0;
        }
    }
  
    // Initialize the number of
    // ones required in every row
    for(int i = 0; i < n; i++)
        row[i] = a;
  
    // Initialize the number of
    // ones required in each column
    for(int i = 0; i < m; i++)
        col[i] = b;
  
    int l = 0, d = 0;
  
    // Check if the total number of
    // ones required in every row is
    // not equal to total number of
    // ones required in every column
    // then print No
    if (n * a != m * b)
        printMatrix(matrix, "No");
  
    else 
    {
        for(int i = 0; i < n; i++)
        {
            int j;
            if (l == m)
                l = 0;
  
            for(j = l; j < m; j++)
            {
                if (row[i] > 0 && col[j] > 0)
                {
                      
                    // Fill a one if there is a
                    // place to be filled
                    matrix[i,j] = 1;
  
                    // Decrease the number of
                    // ones required in ith row
                    row[i]--;
  
                    // Decrease the number of
                    // ones required in jth column
                    col[j]--;
                    d = j;
                }
            }
            l = d + 1;
            if (row[i] != 0)
            {
                for(j = 0; j < m; j++)
                {
                    if (row[i] > 0 && col[j] > 0) 
                    {
                          
                        // Fill a one if there is
                        // a place to be filled
                        matrix[i,j] = 1;
  
                        // Decrease the number of 1s
                        // required in ith row
                        row[i]--;
                        // Decrease the number of 1s
                        // required in jth column
                        col[j]--;
                        l = j + 1;
                    }
                      
                    // Break the loop if no place
                    // is left for ones to filled
                    if (row[i] == 0)
                        break;
                }
            }
        }
  
        // Function call to print the matrix
        printMatrix(matrix, "Yes");
    }
}
  
// Driver Code
public static void Main(String[] args)
{
  
    // Number of ones required
    // in every row
    int a = 2;
  
    // Number of ones required
    // in every column
    int b = 1;
  
    // Function call
    createMatrix(a, b);
}
}
  
// This code is contributed by gauravrajput1
chevron_right

Output: 
1 1 0 0 0 0 
0 0 1 1 0 0 
0 0 0 0 1 1

Time Complexity: O(N*M)
Auxiliary Space: O(N*M)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




Recommended Posts:


Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Article Tags :