Open In App

Check if it is possible to make all elements into 1 except obstacles

Last Updated : 30 Mar, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Given a matrix M[][] of size N * M containing characters 0 and X. You have to choose a sub-matrix of 2*2 size, which doesn’t contains X in it, and convert all the 0 under that sub-matrix into 1. Update M[][] after each operation. Return “YES“, otherwise “NO” If it is possible to make all the zeros into ones except the cell containing X by using the given operation.

Examples:

Input: N = 3, M = 3

M[][]: 

0 0 X
0 0 0
0 0 0 
Output: YES
Explanation:

Graphical Explanation of input test case 1

It can be seen that from the initial matrix, at each operation a sub-matrix of size 2*2 is chose and convert all the zeros into ones under those sub-matrices using the given operation. It also noted that some sub-matrices contain 1 also, in this case remain the same. Any sub-matrix of size 2*2 doesn’t contains ‘X’. Therefore, it is possible to convert all the zeros into ones using given operation except X. Hence output is YES. 

Input: N = 4, M = 2

M[][]:

0 0 0 X
0 0 0 0
Output: NO
Explanation:

Graphical explanation of input test case 2

 It can be verified that all zeros in initial matrix can’t be converted into ones.   

Approach: Implement the idea below to solve the problem:

The problem is observation based and can be solved by using those observations.

Steps were taken to solve the problem:

  1. Create a StringBuilder Array let’s say X[] of size N.
  2. Initialize X[] with input matrix M[][].
  3. Run two nested loops for i = 0 to i < N – 1 and j = 0 to j < M – 1 and follow the below-mentioned steps under the scope of the loop:
    • If ( X[ i ].charAt( j ) == ‘0’ || X[ i ].charAt( j ) == ‘1’ )
      • If ( X[ i ].charAt(j + 1) != 88 && X[i + 1].charAt(j + 1) != 88 && X[i + 1].charAt( j ) != 88)
        • X[ i ].setCharAt(j, ‘1’)
        • X[ i ].setCharAt(j + 1, ‘1’)
        • X[i + 1].setCharAt(j, ‘1’)
        • X[i + 1].setCharAt(j + 1, ‘1’)
  4. Now, just traverse the X[] and check if there exists 0 or not. If 0 exists then output NO or else YES

Below is the code to implement the approach:

C++




// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function for checking is it possible
// to make all zeros into ones
void Is_Possible(int N, int M, vector <string>& x)
{
 
    // Implementing the approach on original matrix
    for (int i = 0; i < N - 1; i++) {
 
        for (int j = 0; j < M - 1; j++)
        {
            if (x[i][j] == '0' || x[i][j] == '1')
            {
                if (x[i][j + 1] != 'X' &&
                    x[i + 1][j + 1] != 'X' &&
                    x[i + 1][j] != 'X')
                {
                    x[i][j] = '1';
                    x[i][j + 1] = '1';
                    x[i + 1][j] = '1';
                    x[i + 1][j + 1] = '1';
                }
            }
        }
    }
 
    // Flag initialized and set to false
    bool flag = false;
 
    // Traversing vector of string x[]
    // to check if there is an element
    // exists any 0 Which is still not
    // converted into 1
    for (int i = 0; i < N; i++) {
 
        for (int j = 0; j < M; j++) {
            if (x[i][j] == '0') {
                cout << "NO" << endl;
                flag = true;
                break;
            }
        }
        if (flag)
            break;
    }
    if (!flag)
        cout << "YES" << endl;
}
 
int main() {
 
       // Inputs
       int N = 4;
       int M = 2;
       vector <string> arr = { "00", "00", "00", "0X" };
 
    // Function call
    Is_Possible(N, M, arr);
}


Java




// Java code to implement the approahc
import java.util.*;
 
class GFG {
 
    // Driver Function
    public static void main(String az[])
    {
 
        // Inputs
        int N = 4;
        int M = 2;
        String[] arr = { "00", "00", "00", "0X" };
 
        // Function call
        Is_Possible(N, M, arr);
    }
 
    // Function for checking is it possible
    // to make all zeros into ones
    static void Is_Possible(int N, int M, String[] arr)
    {
 
        // StringBuilder array object is
        // initialized to hold matrix
        StringBuilder x[] = new StringBuilder[N];
 
        // Loop for initializing
        // StringBuilder array
        for (int i = 0; i < N; i++) {
 
            x[i] = new StringBuilder(arr[i]);
        }
 
        // Implementing the approach
        for (int i = 0; i < N - 1; i++) {
 
            for (int j = 0; j < M - 1; j++) {
                if (x[i].charAt(j) == '0'
                    || x[i].charAt(j) == '1') {
                    if (x[i].charAt(j + 1) != 88
                        && x[i + 1].charAt(j + 1) != 88
                        && x[i + 1].charAt(j) != 88) {
                        x[i].setCharAt(j, '1');
                        x[i].setCharAt(j + 1, '1');
                        x[i + 1].setCharAt(j, '1');
                        x[i + 1].setCharAt(j + 1, '1');
                    }
                }
            }
        }
 
        // Below lines will print
        // StringBuilder object(Should be
        // use only for debugging)
 
        // for(StringBuilder X : x)
        // System.out.println(X);
 
        // Flag initialized and set to false
        boolean flag = false;
 
        // Traversing StringBuilder array
        // to check if there is an element
        // exists any 0 Which is still not
        // converted into 1
        for (int i = 0; i < N; i++) {
 
            for (int j = 0; j < M; j++) {
                if (x[i].charAt(j) == '0') {
                    System.out.println("NO");
                    flag = true;
                    break;
                }
            }
            if (flag)
                break;
        }
        if (!flag)
            System.out.println("YES");
    }
}


C#




// C# code to implement the approahc
using System;
using System.Text;
 
public class GFG{
 
    // Function for checking is it possible
    // to make all zeros into ones
    static void Is_Possible(int N, int M, string[] arr)
    {
    // StringBuilder array object is
        // initialized to hold matrix
        StringBuilder[] x = new StringBuilder[N];
 
        // Loop for initializing
        // StringBuilder array
        for (int i = 0; i < N; i++) {
 
            x[i] = new StringBuilder(arr[i]);
        }
 
       for (int i = 0; i < N - 1; i++) {
 
            for (int j = 0; j < M - 1; j++)
            {
                if (x[i][j] == '0' || x[i][j] == '1')
                {
                    if (x[i][j + 1] != 'X' &&
                        x[i + 1][j + 1] != 'X' &&
                        x[i + 1][j] != 'X')
                    {
                        x[i][j] = '1';
                        x[i][j + 1] = '1';
                        x[i + 1][j] = '1';
                        x[i + 1][j + 1] = '1';
                    }
                }
            }
        }
 
      
        // Flag initialized and set to false
        bool flag = false;
 
        // Traversing StringBuilder array
        // to check if there is an element
        // exists any 0 Which is still not
        // converted into 1
        for (int i = 0; i < N; i++) {
 
            for (int j = 0; j < M; j++) {
                 if (x[i][j] == '0') {
                    Console.WriteLine("NO");
                    flag = true;
                    break;
                }
            }
            if (flag)
                break;
        }
        if (!flag)
            Console.WriteLine("YES");
    }
    static public void Main (){
 
         // Inputs
        int N = 4;
        int M = 2;
        string[] arr = { "00", "00", "00", "0X" };
 
        // Function call
        Is_Possible(N, M, arr);
    }
}


Python




# Function for checking if it is possible to make all zeros into ones
def is_possible(n, m, arr):
 
    # Initialize a list of lists to hold the matrix
    x = [list(row) for row in arr]
 
    # Implementing the approach
    for i in range(n - 1):
 
        for j in range(m - 1):
            if x[i][j] == '0' or x[i][j] == '1':
                if x[i][j + 1] != 'X' and x[i + 1][j + 1] != 'X' and x[i + 1][j] != 'X':
                    x[i][j] = '1'
                    x[i][j + 1] = '1'
                    x[i + 1][j] = '1'
                    x[i + 1][j + 1] = '1'
 
    # Traversing list of lists to check if there is any 0 which is still not converted into 1
    for i in range(n):
 
        for j in range(m):
            if x[i][j] == '0':
                return "NO"
 
    return "YES"
 
 
# Driver code
if __name__ == "__main__":
 
    # Inputs
    n = 4
    m = 2
    arr = ["00", "00", "00", "0X"]
 
    # Function call
    print(is_possible(n, m, arr))


Javascript




// JavaScript code to implement the approach
 
// Function for checking is it possible
// to make all zeros into ones
function Is_Possible(N, M, arr) {
    // Implementing the approach on original matrix
    for (let i = 0; i < N - 1; i++) {
 
        for (let j = 0; j < M - 1; j++) {
            if (arr[i][j] == '0' || arr[i][j] == '1') {
                if (arr[i][j + 1] != 'X' &&
                    arr[i + 1][j + 1] != 'X' &&
                    arr[i + 1][j] != 'X') {
                    arr[i] = arr[i].substr(0, j) + '11' + arr[i].substr(j + 2, M);
                    arr[i + 1] = arr[i + 1].substr(0, j) + '11' + arr[i + 1].substr(j + 2, M);
                }
            }
        }
    }
 
    // Flag initialized and set to false
    let flag = false;
 
    // Traversing array of strings arr[]
    // to check if there is an element
    // exists any 0 Which is still not
    // converted into 1
    for (let i = 0; i < N; i++) {
 
        for (let j = 0; j < M; j++) {
            if (arr[i][j] == '0') {
                console.log("NO");
                flag = true;
                break;
            }
        }
        if (flag)
            break;
    }
    if (!flag)
        console.log("YES");
}
 
// Inputs
let N = 4;
let M = 2;
let arr = ["00", "00", "00", "0X"];
 
// Function call
Is_Possible(N, M, arr);


Output

NO

Time Complexity: O(N*M)
Auxiliary Space: O(N*M), As StringBuilder is used of size N*M.



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads