Number of days until all chocolates become unhealthy

Pablo has square chocolate Box of size n x n in which a variety of healthy chocolates are present denoted by ‘H’ initially but he finds out that some of the chocolates are rotten and are unhealthy denoted by ‘U’. In one day the rotten chocolates make all its neighbouring chocolates as unhealthy. This goes on and on until all chocolates present in the chocolate box becomes Unhealthy to eat. Find out the number of days in which the whole chocolate box becomes Unhealthy.
(Note : It is guaranteed that atleast one of the chocolate is Unhealthy)

Examples:

Input :  n = 3
         H H H
         H U H
         H H H
Output : 1
Only 1 day is required to turn all the
chocolates unhealthy in the chocolate box.

Input :  n = 4
         H H H U
         H H H H
         H U H H
         H H H H
Output : 2
Explanation:
In first day chocolate at (0, 0), (0, 1),
(2, 3), (3, 3) will remain healthy and in
the second day all the chocolates will
become unhealthy.

Asked in Amazon, Accolite, Arcesium.

Brute Force Approach:
Initialize a flag = 1. Use a while loop, inside that while search for an H (searching requires O(n^2) time complexity if we are unable to find a H in the 2-D character array stop incrementing the day counter and set flag as 0 to break the loop.



Below is the implementation of above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find number of days before
// all chocolates become unhealthy.
#include <bits/stdc++.h>
using namespace std;
  
// Validates out of bounds indexing
bool isValid(int i, int j, int n)
{
    if (i < 0 || j < 0 || i >= n || j >= n)
        return false;
    return true;
}
  
// function for returning number of days
int numdays(char arr[][4], int n)
{
    int numdays = 0;
  
    while (true)
    {
        // Traverse matrix to look for unhealthy
        // chocolates and mark their neighbors.
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (arr[i][j] == 'U')
                {
  
                    if (isValid(i - 1, j - 1, n) &&
                        arr[i - 1][j - 1] == 'H')
                        arr[i - 1][j - 1] = 'V';
  
                    if (isValid(i - 1, j, n) &&
                        arr[i - 1][j] == 'H')
                        arr[i - 1][j] = 'V';
  
                    if (isValid(i - 1, j + 1, n) &&
                        arr[i - 1][j + 1] == 'H')
                        arr[i - 1][j + 1] = 'V';
  
                    if (isValid(i, j - 1, n) &&
                        arr[i][j - 1] == 'H')
                        arr[i][j - 1] = 'V';
  
                    if (isValid(i, j + 1, n) &&
                        arr[i][j + 1] == 'H')
                        arr[i][j + 1] = 'V';
  
                    if (isValid(i + 1, j - 1, n) &&
                        arr[i + 1][j - 1] == 'H')
                        arr[i + 1][j - 1] = 'V';
  
                    if (isValid(i + 1, j, n) &&
                            arr[i + 1][j] == 'H')
                        arr[i + 1][j] = 'V';
  
                    if (isValid(i + 1, j + 1, n) &&
                        arr[i + 1][j + 1] == 'H')
                        arr[i + 1][j + 1] = 'V';
                }
  
                /*Here we are assigning the neighbours of U
                with the character V because we don't want
                these neighbours to be counted in that
                particular day. If we do not do so, in the
                next iteration that neighbour will also get
                counted which was supposed to be counted in
                the next day. */
            }
        }
  
        // Mark chocolates unhealthy which are made
        // unhealthy in current day.
        bool Hflag = false;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (arr[i][j] == 'V')
                {
                    arr[i][j] = 'U';
                    Hflag = true;
                }
            }
        }
  
        // Check if there was any chocoloate
        // marked unhealthy in current day
        if (Hflag)
            numdays++;
        else
            break;
    }
    return numdays;
}
  
// Driver function
int main()
{
    int n = 4;
    char arr[4][4] = { 'H', 'H', 'H', 'U',
                       'H', 'H', 'H', 'H',
                       'H', 'U', 'H', 'H',
                       'H', 'H', 'H', 'H'
                     };
    int ans = numdays(arr, n);
    cout << "number of days taken : "
         << ans << "\n";
    return 0;
}

chevron_right


C

filter_none

edit
close

play_arrow

link
brightness_4
code

// C program to find number of days before
// all chocolates become unhealthy.
#include <stdio.h>
  
// Validates out of bounds indexing
int isValid(int i, int j, int n)
{
    if (i < 0 || j < 0 || i >= n || j >= n)
        return 0;
    return 1;
}
  
// function for returning number of days
int numdays(char arr[][4], int n)
{
    int numdays = 0;
  
    while (1)
    {
        // Traverse matrix to look for unhealthy
        // chocolates and mark their neighbors.
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (arr[i][j] == 'U')
                {
  
                    if (isValid(i - 1, j - 1, n) &&
                        arr[i - 1][j - 1] == 'H')
                        arr[i - 1][j - 1] = 'V';
  
                    if (isValid(i - 1, j, n) &&
                        arr[i - 1][j] == 'H')
                        arr[i - 1][j] = 'V';
  
                    if (isValid(i - 1, j + 1, n) &&
                        arr[i - 1][j + 1] == 'H')
                        arr[i - 1][j + 1] = 'V';
  
                    if (isValid(i, j - 1, n) &&
                        arr[i][j - 1] == 'H')
                        arr[i][j - 1] = 'V';
  
                    if (isValid(i, j + 1, n) &&
                        arr[i][j + 1] == 'H')
                        arr[i][j + 1] = 'V';
  
                    if (isValid(i + 1, j - 1, n) &&
                        arr[i + 1][j - 1] == 'H')
                        arr[i + 1][j - 1] = 'V';
  
                    if (isValid(i + 1, j, n) &&
                            arr[i + 1][j] == 'H')
                        arr[i + 1][j] = 'V';
  
                    if (isValid(i + 1, j + 1, n) &&
                        arr[i + 1][j + 1] == 'H')
                        arr[i + 1][j + 1] = 'V';
                }
  
                /*Here we are assigning the neighbours of U
                with the character V because we don't want
                these neighbours to be counted in that
                particular day. If we do not do so, in the
                next iteration that neighbour will also get
                counted which was supposed to be counted in
                the next day. */
            }
        }
  
        // Mark chocolates unhealthy which are made
        // unhealthy in current day.
        int Hflag = 0;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (arr[i][j] == 'V')
                {
                    arr[i][j] = 'U';
                    Hflag = 1;
                }
            }
        }
  
        // Check if there was any chocoloate
        // marked unhealthy in current day
        if (Hflag)
            numdays++;
        else
            break;
    }
    return numdays;
}
  
// Driver Code
int main()
{
    int n = 4;
    char arr[4][4] = { 'H', 'H', 'H', 'U',
                       'H', 'H', 'H', 'H',
                       'H', 'U', 'H', 'H',
                       'H', 'H', 'H', 'H' };
    int ans = numdays(arr, n);
    printf("number of days taken : %d\n", ans);
    return 0;
}
  
// This code is contributed by ankush_953

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find number of days before
// all chocolates become unhealthy.
class GFG
{
      
    // Validates out of bounds indexing
    static boolean isValid(int i, int j, int n)
    {
        if (i < 0 || j < 0 || i >= n || j >= n)
            return false;
        return true;
    }
  
    // function for returning number of days
    static int numdays(char [][]arr, int n)
    {
        int numdays = 0;
  
        while (true)
        {
            // Traverse matrix to look for unhealthy
            // chocolates and mark their neighbors.
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (arr[i][j] == 'U')
                    {
  
                        if (isValid(i - 1, j - 1, n) &&
                            arr[i - 1][j - 1] == 'H')
                            arr[i - 1][j - 1] = 'V';
  
                        if (isValid(i - 1, j, n) &&
                            arr[i - 1][j] == 'H')
                            arr[i - 1][j] = 'V';
  
                        if (isValid(i - 1, j + 1, n) &&
                            arr[i - 1][j + 1] == 'H')
                            arr[i - 1][j + 1] = 'V';
  
                        if (isValid(i, j - 1, n) &&
                            arr[i][j - 1] == 'H')
                            arr[i][j - 1] = 'V';
  
                        if (isValid(i, j + 1, n) &&
                            arr[i][j + 1] == 'H')
                            arr[i][j + 1] = 'V';
  
                        if (isValid(i + 1, j - 1, n) &&
                            arr[i + 1][j - 1] == 'H')
                            arr[i + 1][j - 1] = 'V';
  
                        if (isValid(i + 1, j, n) &&
                                arr[i + 1][j] == 'H')
                            arr[i + 1][j] = 'V';
  
                        if (isValid(i + 1, j + 1, n) &&
                            arr[i + 1][j + 1] == 'H')
                            arr[i + 1][j + 1] = 'V';
                    }
  
                    /*Here we are assigning the neighbours of U
                    with the character V because we don't want
                    these neighbours to be counted in that
                    particular day. If we do not do so, in the
                    next iteration that neighbour will also get
                    counted which was supposed to be counted in
                    the next day. */
                }
            }
  
            // Mark chocolates unhealthy which are made
            // unhealthy in current day.
            boolean Hflag = false;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (arr[i][j] == 'V')
                    {
                        arr[i][j] = 'U';
                        Hflag = true;
                    }
                }
            }
  
            // Check if there was any chocoloate
            // marked unhealthy in current day
            if (Hflag)
                numdays++;
            else
                break;
        }
        return numdays;
    }
      
    // Driver Code
    public static void main(String []args)
    {
        int n = 4;
        char [][]arr = {{'H', 'H', 'H', 'U'},
                        {'H', 'H', 'H', 'H'},
                        {'H', 'U', 'H', 'H'},
                        {'H', 'H', 'H', 'H'}};
        int ans = numdays(arr, n);
        System.out.println("number of days taken : " + ans);
    }
  
}
  
// This code is contributed by ankush_953

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find number of days before
# all chocolates become unhealthy.
  
# Validates out of bounds indexing
def isValid(i, j, n):
    if (i < 0 or j < 0 or i >= n or j >= n):
        return False
    return True
  
# function for returning number of days
def numdays(arr, n):
    numdays = 0
    while (True):
          
        # Traverse matrix to look for unhealthy
        # chocolates and mark their neighbors.
        for i in range(n):
            for j in range(n):
                if (arr[i][j] == 'U'):
                    if (isValid(i - 1, j - 1, n) and\
                        arr[i - 1][j - 1] == 'H'):
                        arr[i - 1][j - 1] = 'V'
                          
                    if (isValid(i - 1, j, n) and\
                        arr[i - 1][j] == 'H'):
                        arr[i - 1][j] = 'V'
  
                    if (isValid(i - 1, j + 1, n) and\
                        arr[i - 1][j + 1] == 'H'):
                        arr[i - 1][j + 1] = 'V'
  
                    if (isValid(i, j - 1, n) and\
                        arr[i][j - 1] == 'H'):
                        arr[i][j - 1] = 'V'
  
                    if (isValid(i, j + 1, n) and\
                        arr[i][j + 1] == 'H'):
                        arr[i][j + 1] = 'V'
  
                    if (isValid(i + 1, j - 1, n) and\
                        arr[i + 1][j - 1] == 'H'):
                        arr[i + 1][j - 1] = 'V'
  
                    if (isValid(i + 1, j, n) and\
                        arr[i + 1][j] == 'H'):
                        arr[i + 1][j] = 'V'
  
                    if (isValid(i + 1, j + 1, n) and\
                        arr[i + 1][j + 1] == 'H'):
                        arr[i + 1][j + 1] = 'V'
  
                # Here we are assigning the neighbours of U
                # with the character V because we don't want
                # these neighbours to be counted in that
                # particular day. If we do not do so, in the
                # next iteration that neighbour will also get
                # counted which was supposed to be counted in
                # the next day.
          
        # Mark chocolates unhealthy which are made
        # unhealthy in current day.
        Hflag = False
        for i in range(n):
            for j in range(n):
                if (arr[i][j] == 'V'):
                    arr[i][j] = 'U'
                    Hflag = True
  
        # Check if there was any chocoloate
        # marked unhealthy in current day
        if (Hflag):
            numdays += 1
        else:
            break
          
    return numdays
  
# Driver Code
n = 4
arr = [['H', 'H', 'H', 'U'],
       ['H', 'H', 'H', 'H'],
       ['H', 'U', 'H', 'H'],
       ['H', 'H', 'H', 'H']]
ans = numdays(arr, n)
print("number of days taken :", ans)
  
# This code is contributed by ankush_953

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find number of days before
// all chocolates become unhealthy.
using System;
  
class GFG{
  
    // Validates out of bounds indexing
    static bool isValid(int i, int j, int n)
    {
        if (i < 0 || j < 0 || i >= n || j >= n)
            return false;
        return true;
    }
      
    // function for returning number of days
    static int numdays(char[][] arr, int n)
    {
        int numdays = 0;
      
        while (true)
        {
            // Traverse matrix to look for unhealthy
            // chocolates and mark their neighbors.
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (arr[i][j] == 'U')
                    {
      
                        if (isValid(i - 1, j - 1, n) &&
                            arr[i - 1][j - 1] == 'H')
                            arr[i - 1][j - 1] = 'V';
      
                        if (isValid(i - 1, j, n) &&
                            arr[i - 1][j] == 'H')
                            arr[i - 1][j] = 'V';
      
                        if (isValid(i - 1, j + 1, n) &&
                            arr[i - 1][j + 1] == 'H')
                            arr[i - 1][j + 1] = 'V';
      
                        if (isValid(i, j - 1, n) &&
                            arr[i][j - 1] == 'H')
                            arr[i][j - 1] = 'V';
      
                        if (isValid(i, j + 1, n) &&
                            arr[i][j + 1] == 'H')
                            arr[i][j + 1] = 'V';
      
                        if (isValid(i + 1, j - 1, n) &&
                            arr[i + 1][j - 1] == 'H')
                            arr[i + 1][j - 1] = 'V';
      
                        if (isValid(i + 1, j, n) &&
                                arr[i + 1][j] == 'H')
                            arr[i + 1][j] = 'V';
      
                        if (isValid(i + 1, j + 1, n) &&
                            arr[i + 1][j + 1] == 'H')
                            arr[i + 1][j + 1] = 'V';
                    }
      
                    /*Here we are assigning the neighbours of U
                    with the character V because we don't want
                    these neighbours to be counted in that
                    particular day. If we do not do so, in the
                    next iteration that neighbour will also get
                    counted which was supposed to be counted in
                    the next day. */
                }
            }
      
            // Mark chocolates unhealthy which are made
            // unhealthy in current day.
            bool Hflag = false;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (arr[i][j] == 'V')
                    {
                        arr[i][j] = 'U';
                        Hflag = true;
                    }
                }
            }
      
            // Check if there was any chocoloate
            // marked unhealthy in current day
            if (Hflag)
                numdays++;
            else
                break;
        }
        return numdays;
    }
      
    // Driver function
    static public void Main ()
    {
        int n = 4;
        char[][] arr = new char[][]{"HHHU".ToCharArray(),
                        "HHHH".ToCharArray(),
                        "HUHH".ToCharArray(),
                        "HHHH".ToCharArray()};
        int ans = numdays(arr, n);
        Console.WriteLine("number of days taken : "+ ans);
    }
}
  
// This code is contributed by shubhamsingh10

chevron_right




Output:

 number of days taken : 2

Efficient Approach (Uses BFS)
In this approach, declare a queue which inputs pairs which corresponds to the index of the unhealthy chocolates and then as soon as the index (-1, -1) is reached we increment the numdays counter. This Solution is basically based on calculating levels in level order traversal (Iterative version) of a binary tree in which we push the initial indexes of the unhealthy chocolates instead of root node and incrementing numdays instead of level counter as soon as the index (-1, -1) is reached instead of NULL. As soon as the counter of the flag reaches 2 we break the loop denoting that queue has encoutered two consecutive (-1, -1) pair.

Below is the implementation of above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program using Efficient approach
// to find number of days
#include <bits/stdc++.h>
using namespace std;
  
// Validates out of bounds indexing
bool isValid(int i, int j, int n)
{
    if (i < 0 || j < 0 || i >= n || j >= n)
        return false;
    return true;
}
  
// function for returning number of days
int numdays(char arr[][4], int n)
{
    int numdays = 0;
    int i, j;
    queue<pair<int, int> > q;
  
    // Initializing queue with initial
    // positions of unhealthy chocolates
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++) {
            if (arr[i][j] == 'U')
                q.push(make_pair(i, j));
        }
  
    q.push(make_pair(-1, -1));
  
    // (-1, -1) is used as a checkpoint
    // to count the number of days
    pair<int, int> temp;
  
    // temporary pair to store the indexes
    int flag = 0;
    while (!q.empty()) {
        temp = q.front();
        i = temp.first;
        j = temp.second;
        q.pop();
        if (i == -1 && j == -1) {
            flag++;
            q.push(make_pair(-1, -1));
  
            // pushing the respective
           // checkpoint
            if (flag == 2)
                break;
            numdays++;
        }
        else {
            flag = 0;
            if (isValid(i - 1, j - 1, n) &&
                arr[i - 1][j - 1] == 'H') {
                q.push(make_pair(i - 1, j - 1));
                arr[i - 1][j - 1] = 'U';
            }
  
            if (isValid(i - 1, j, n) &&
                arr[i - 1][j] == 'H') {
                q.push(make_pair(i - 1, j));
                arr[i - 1][j] = 'U';
            }
  
            if (isValid(i - 1, j + 1, n) &&
                arr[i - 1][j + 1] == 'H') {
                q.push(make_pair(i - 1, j + 1));
                arr[i - 1][j + 1] = 'U';
            }
  
            if (isValid(i, j - 1, n) &&
                arr[i][j - 1] == 'H') {
                q.push(make_pair(i, j - 1));
                arr[i][j - 1] = 'U';
            }
  
            if (isValid(i, j + 1, n) &&
                arr[i][j + 1] == 'H') {
                q.push(make_pair(i, j + 1));
                arr[i][j + 1] = 'U';
            }
  
            if (isValid(i + 1, j - 1, n) &&
                arr[i + 1][j - 1] == 'H') {
                q.push(make_pair(i + 1, j - 1));
                arr[i + 1][j - 1] = 'U';
            }
  
            if (isValid(i + 1, j, n) &&
                arr[i + 1][j] == 'H') {
                q.push(make_pair(i + 1, j));
                arr[i + 1][j] = 'U';
            }
  
            if (isValid(i + 1, j + 1, n) &&
                arr[i + 1][j + 1] == 'H') {
                q.push(make_pair(i + 1, j + 1));
                arr[i + 1][j + 1] = 'U';
            }
        }
    }
  
    return numdays - 1;
}
  
// Driver function
int main()
{
    int n = 4;
    char arr[4][4] = { 'H', 'H', 'H', 'U',
                       'H', 'H', 'H', 'H',
                       'H', 'H', 'U', 'H',
                       'H', 'H', 'H', 'H' };
    int ans = numdays(arr, n);
    cout << "number of days taken : "
         << ans << "\n";
    return 0;
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program using Efficient approach
# to find number of days
  
# Validates out of bounds indexing
def isValid(i, j, n):
    if (i < 0 or j < 0 or i >= n or j >= n):
        return False
    return True
  
# function for returning number of days
def numdays(arr, n):
      
    numdays = 0
    i = 0
    j = 0
    q = []
      
    # Initializing queue with initial
    # positions of unhealthy chocolates
    for i in range(n):
        for j in range(n):
            if (arr[i][j] == 'U'):
                q.append([i, j])
      
    q.append([-1, -1])
      
    # (-1, -1) is used as a checkpo
    # to count the number of days
    temp = []
      
    # temporary pair to store the indexes
    flag = 0
    while (len(q)):
        temp = q[0]
        i = temp[0]
        j = temp[1]
        q.pop(0)
        if (i == -1 and j == -1):
            flag += 1
            q.append([-1, -1])
              
            # appending the respective
            # checkpo
            if (flag == 2):
                break
            numdays += 1
        else:
              
            flag = 0
            if (isValid(i - 1, j - 1, n) and arr[i - 1][j - 1] == 'H'):
                q.append([i - 1, j - 1])
                arr[i - 1][j - 1] = 'U'
              
            if (isValid(i - 1, j, n) and arr[i - 1][j] == 'H'):
                q.append([i - 1, j])
                arr[i - 1][j] = 'U'
              
            if (isValid(i - 1, j + 1, n) and arr[i - 1][j + 1] == 'H'):
                q.append([i - 1, j + 1])
                arr[i - 1][j + 1] = 'U'
              
            if (isValid(i, j - 1, n) and arr[i][j - 1] == 'H'):
                q.append([i, j - 1])
                arr[i][j - 1] = 'U'
              
            if (isValid(i, j + 1, n) and arr[i][j + 1] == 'H'):
                q.append([i, j + 1])
                arr[i][j + 1] = 'U'
                  
            if (isValid(i + 1, j - 1, n) and arr[i + 1][j - 1] == 'H'):
                q.append([i + 1, j - 1])
                arr[i + 1][j - 1] = 'U'
                  
            if (isValid(i + 1, j, n) and arr[i + 1][j] == 'H'):
                q.append([i + 1, j])
                arr[i + 1][j] = 'U'
              
            if (isValid(i + 1, j + 1, n) and arr[i + 1][j + 1] == 'H'):
                q.append([i + 1, j + 1])
                arr[i + 1][j + 1] = 'U'
                  
    return numdays - 1
  
  
# Driver function
n = 4
arr = [['H', 'H', 'H', 'U'],['H', 'H', 'H', 'H'],
        ['H', 'H', 'U', 'H'],['H', 'H', 'H', 'H']] 
ans = numdays(arr, n)
print("number of days taken :",ans)
  
# This code is contributed by shubhamsingh10

chevron_right



Output:

number of days taken : 2

competitive-programming-img




My Personal Notes arrow_drop_up

Always code as if the guy who ends up maintaining your code will be violent psychopath who knows where you live visit wwwsahilkhoslacoin

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.



Improved By : ankush_953, SHUBHAMSINGH10