Thursday, October 7, 2021

Forest Fire problem

 source: https://prepinsta.com/tcs-codevita/java-program-for-forest-fire-problem/

Problem Statement:

Roco is an island near Africa which is very prone to forest fire. Forest fire is such that it destroys the complete forest. Not a single tree is left.This island has been cursed by God , and the curse is that whenever a tree catches fire, it passes the fire to all its adjacent tree in all 8 directions,North, South, East, West, North-East, North-West, South-East, and South-West.And it is given that the fire is spreading every minute in the given manner, i.e every tree is passing fire to its adjacent tree.Suppose that the forest layout is as follows where T denotes tree and W denotes water.

Your task is that given the location of the first tree that catches fire, determine how long would it take for the entire forest to be on fire. You may assume that the lay out of the forest is such that the whole forest will catch fire for sure and that there will be at least one tree in the forest

Input Format:

  • First line contains two integers, M, N, space separated, giving the size of the forest in terms of the number of rows and columns respectively.
  • The next line contains two integers X,Y, space separated, giving the coordinates of the first tree that catches the fire.
  • The next M lines, where ith line containing N characters each of which is either T or W, giving the position of the Tree and Water in the  ith row of the forest.

Output Format:

Single integer indicating the number of minutes taken for the entire forest to catch fire

Constrains:

  • 3 ≤ M ≤ 20
  • 3 ≤ N ≤ 20

 

Sample Input 1:

3 3

1 2

W T T
T W W
W T T
Sample Output 1:

5

Explanation:
In the second minute,tree at (1,2) catches fire,in the third minute,the tree at (2,1) catches fire,fourth minute tree at (3,2) catches fire and in the fifth minute the last tree at (3,3) catches fire.


Sample Input 2:
6 6
1 6
W T T T T T
T W W W W W
W T T T T T
W W W W W T
T T T T T T
T W W W W W

Sample Output 2:

16


SOLUTION:

#include <stdio.h>

#include <stdbool.h>


int f[20][20];

int r[100],c[100],listCursor=0,len=0,m,n;


bool burnit(int i, int j, int v) {

    if(i<0 || j<0 || i>=m || j>=n)

        return false;

    if(f[i][j] == 0) {

        f[i][j] = v+1;

        r[len]=i;

        c[len]=j;

        len++;

        return true;

    }

    return false;

}


int bfs() {

    int i,j;

    while(listCursor < len){

        i=r[listCursor];

        j=c[listCursor];

        // printf("%d %d is fired\n", r[listCursor], c[listCursor]);

        listCursor++;

        burnit(i-1,j-1,f[i][j]);

        burnit(i-1,j,f[i][j]);

        burnit(i-1,j+1,f[i][j]);

        burnit(i,j+1,f[i][j]);

        burnit(i+1,j+1,f[i][j]);

        burnit(i+1,j,f[i][j]);

        burnit(i+1,j-1,f[i][j]);

        burnit(i,j-1,f[i][j]);

    }

    return f[i][j];

}


int main()

{

    char temp;

    int i,j,r1,c1;

    scanf("%d %d %d %d\n", &m, &n, &i, &j);

    for(r1=0;r1<m;r1++){

        for(c1=0;c1<n;c1++){

            scanf("%c", &temp);

            if(temp=='W')

                f[r1][c1] = 500;

            else

                f[r1][c1] = 0;

        }

        scanf("\n");

    }

    // check for correct input pattern

    // for(r1=0;r1<m;r1++){

    //     for(c1=0;c1<n;c1++){

    //         printf("%d ", f[r1][c1]);

    //     }

    //     printf("\n");

    // }

    r[0] =i-1;

    c[0] =j-1;

    len++;

    f[i-1][j-1] = 1;

    printf("total is: %d", bfs());

}

Wednesday, September 29, 2021

Maneuvering a Cave Problem

Problem Description 
The task is to count all the possible paths from top left to bottom right of a m x n matrix with the constraints that from each cell you can either move only to right or down. 

Input: 
First line consists of T test cases. First line of every test case consists of N and M, denoting the number of rows and number of columns respectively. 

Output: 
Single line output i.e count of all the possible paths from top left to bottom right of a m x n matrix.. 

Constraints: 
1<=T<=100 
1<=N<=100 
1<=M<=100 

SOLUTION (JAVA): 
import java.util.Scanner;
public class MyClass {
    static int count =0,m,n;
    public static void main(String args[]) {
      Scanner sc = new Scanner(System.in);
      m= sc.nextInt();
      n= sc.nextInt();
      findWays(1,1);
      System.out.println(count);
    }
    
    static void findWays(int i, int j) {
        if(i>m || j>n)
            return;
        if(i==m && j==n){
            count++;
        }
        findWays(i, j+1);
        findWays(i+1,j);
    }
}

SOLUTION (C): 
#include <stdio.h>

int getPaths(int i, int j, int m, int n){
    if(i==m && j==n)
        return 1;
        
    if(i>m || j>n)
        return 0;
    
    return getPaths(i+1,j,m,n)+ getPaths(i,j+1,m,n);
}

int main()
{
    int m,n,i,j;
    scanf("%d %d", &m, &n);
    printf("total paths are : %d", getPaths(0,0,m-1,n-1));
    return 0;
}