Programa para encontrar la cantidad de agua en un vaso dado

Hay algunos vasos con capacidad igual a 1 litro. Los vasos se mantienen de la siguiente manera: 

                   1
                 2   3
              4    5    6
            7    8    9   10

Puedes poner agua en el único vaso superior. Si pone más de 1 litro de agua en el primer vaso, el agua se desborda y llena por igual el segundo y el tercer vaso. El vaso 5 obtendrá agua tanto del segundo vaso como del tercero y así sucesivamente. 

Si tienes X litros de agua y la pones en un vaso superior, ¿cuánta agua contendrá el j-ésimo vaso en una i-ésima fila?

Ejemplo. Si vas a poner 2 litros encima. 
1° – 1 litro 
2° – 1/2 litro 
3° – 1/2 litro

El enfoque es similar al Método 2 del Triángulo de Pascal . Si echamos un vistazo más de cerca al problema, el problema se reduce al Triángulo de Pascal .  

                           1   ---------------- 1
                 2   3 ---------------- 2
                      4    5    6  ------------ 3
            7    8    9   10  --------- 4

Cada vaso contribuye a los dos vasos del vaso. Inicialmente, ponemos toda el agua en el primer vaso. Luego mantenemos 1 litro (o menos de 1 litro) y movemos el resto del agua a dos vasos. Seguimos el mismo proceso para los dos vasos y todos los demás vasos hasta la i-ésima fila. Habrá i*(i+1)/2 vasos hasta la i-ésima fila. 

C++

// Program to find the amount of water in j-th glass
// of i-th row
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
// Returns the amount of water in jth glass of ith row
float findWater(int i, int j, float X)
{
    // A row number i has maximum i columns. So input
    // column number must be less than i
    if (j > i)
    {
        printf("Incorrect Inputn");
        exit(0);
    }
 
    // There will be i*(i+1)/2 glasses till ith row
    // (including ith row)
    float glass[i * (i + 1) / 2];
 
    // Initialize all glasses as empty
    memset(glass, 0, sizeof(glass));
 
    // Put all water in first glass
    int index = 0;
    glass[index] = X;
 
    // Now let the water flow to the downward glasses
    // till the row number is less than or/ equal to i (given row)
    // correction : X can be zero for side glasses as they have lower rate to fill
    for (int row = 1; row <= i ; ++row)
    {
        // Fill glasses in a given row. Number of
        // columns in a row is equal to row number
        for (int col = 1; col <= row; ++col, ++index)
        {
            // Get the water from current glass
            X = glass[index];
 
            // Keep the amount less than or equal to
            // capacity in current glass
            glass[index] = (X >= 1.0f) ? 1.0f : X;
 
            // Get the remaining amount
            X = (X >= 1.0f) ? (X - 1) : 0.0f;
 
            // Distribute the remaining amount to
            // the down two glasses
            glass[index + row] += X / 2;
            glass[index + row + 1] += X / 2;
        }
    }
 
    // The index of jth glass in ith row will
    // be i*(i-1)/2 + j - 1
    return glass[i*(i-1)/2 + j - 1];
}
 
// Driver program to test above function
int main()
{
    int i = 2, j = 2;
    float X = 2.0; // Total amount of water
 
    printf("Amount of water in jth glass of ith row is: %f",
            findWater(i, j, X));
 
    return 0;
}

Java

// Program to find the amount
/// of water in j-th glass
// of i-th row
import java.lang.*;
 
class GFG
{
// Returns the amount of water
// in jth glass of ith row
static float findWater(int i, int j,
                       float X)
{
// A row number i has maximum i
// columns. So input column
// number must be less than i
if (j > i)
{
    System.out.println("Incorrect Input");
    System.exit(0);
}
 
// There will be i*(i+1)/2 glasses
// till ith row (including ith row)
int ll = Math.round((i * (i + 1) ));
float[] glass = new float[ll + 2];
 
// Put all water in first glass
int index = 0;
glass[index] = X;
 
// Now let the water flow to the
// downward glasses till the row
// number is less than or/ equal
// to i (given row)
// correction : X can be zero for side
// glasses as they have lower rate to fill
for (int row = 1; row <= i ; ++row)
{
    // Fill glasses in a given row. Number of
    // columns in a row is equal to row number
    for (int col = 1;
             col <= row; ++col, ++index)
    {
        // Get the water from current glass
        X = glass[index];
 
        // Keep the amount less than or
        // equal to capacity in current glass
        glass[index] = (X >= 1.0f) ? 1.0f : X;
 
        // Get the remaining amount
        X = (X >= 1.0f) ? (X - 1) : 0.0f;
 
        // Distribute the remaining amount 
        // to the down two glasses
        glass[index + row] += X / 2;
        glass[index + row + 1] += X / 2;
    }
}
 
// The index of jth glass in ith
// row will be i*(i-1)/2 + j - 1
return glass[(int)(i * (i - 1) /
                   2 + j - 1)];
}
 
// Driver Code
public static void main(String[] args)
{
    int i = 2, j = 2;
    float X = 2.0f; // Total amount of water
    System.out.println("Amount of water in jth " +
                         "glass of ith row is: " +
                              findWater(i, j, X));
}
}
 
// This code is contributed by mits

Python3

# Program to find the amount
# of water in j-th glass of
# i-th row
 
# Returns the amount of water
# in jth glass of ith row
def findWater(i, j, X):
    # A row number i has maximum
    # i columns. So input column
    # number must be less than i
    if (j > i):
        print("Incorrect Input");
        return;
 
    # There will be i*(i+1)/2
    # glasses till ith row
    # (including ith row)
    # and Initialize all glasses
    # as empty
    glass = [0]*int(i *(i + 1) / 2);
 
    # Put all water
    # in first glass
    index = 0;
    glass[index] = X;
 
    # Now let the water flow to
    # the downward glasses till
    # the row number is less
    # than or/ equal to i (given
    # row) correction : X can be
    # zero for side glasses as
    # they have lower rate to fill
    for row in range(1,i):
        # Fill glasses in a given
        # row. Number of columns
        # in a row is equal to row number
        for col in range(1,row+1):
            # Get the water
            # from current glass
            X = glass[index];
 
            # Keep the amount less
            # than or equal to
            # capacity in current glass
            glass[index] = 1.0 if (X >= 1.0) else X;
 
            # Get the remaining amount
            X = (X - 1) if (X >= 1.0) else 0.0;
 
            # Distribute the remaining
            # amount to the down two glasses
            glass[index + row] += (X / 2);
            glass[index + row + 1] += (X / 2);
            index+=1;
 
    # The index of jth glass
    # in ith row will
    # be i*(i-1)/2 + j - 1
    return glass[int(i * (i - 1) /2 + j - 1)];
 
# Driver Code
if __name__ == "__main__":
     
    i = 2;
    j = 2;
    X = 2.0;
# Total amount of water
 
    res=repr(findWater(i, j, X));
    print("Amount of water in jth glass of ith row is:",res.ljust(8,'0'));
# This Code is contributed by mits

C#

// Program to find the amount
// of water in j-th glass
// of i-th row
using System;
 
class GFG
{
// Returns the amount of water
// in jth glass of ith row
static float findWater(int i, int j,
                       float X)
{
// A row number i has maximum i
// columns. So input column
// number must be less than i
if (j > i)
{
    Console.WriteLine("Incorrect Input");
    Environment.Exit(0);
}
 
// There will be i*(i+1)/2 glasses
// till ith row (including ith row)
int ll = (int)Math.Round((double)(i * (i + 1)));
float[] glass = new float[ll + 2];
 
// Put all water in first glass
int index = 0;
glass[index] = X;
 
// Now let the water flow to the
// downward glasses till the row
// number is less than or/ equal
// to i (given row)
// correction : X can be zero
// for side glasses as they have
// lower rate to fill
for (int row = 1; row <= i ; ++row)
{
    // Fill glasses in a given row.
    // Number of columns in a row
    // is equal to row number
    for (int col = 1;
            col <= row; ++col, ++index)
    {
        // Get the water from current glass
        X = glass[index];
 
        // Keep the amount less than
        // or equal to capacity in
        // current glass
        glass[index] = (X >= 1.0f) ?
                              1.0f : X;
 
        // Get the remaining amount
        X = (X >= 1.0f) ? (X - 1) : 0.0f;
 
        // Distribute the remaining amount
        // to the down two glasses
        glass[index + row] += X / 2;
        glass[index + row + 1] += X / 2;
    }
}
 
// The index of jth glass in ith
// row will be i*(i-1)/2 + j - 1
return glass[(int)(i * (i - 1) /
                   2 + j - 1)];
}
 
// Driver Code
static void Main()
{
    int i = 2, j = 2;
    float X = 2.0f; // Total amount of water
    Console.WriteLine("Amount of water in jth " +
                        "glass of ith row is: " +
                             findWater(i, j, X));
}
}
 
// This code is contributed by mits

PHP

<?php
// Program to find the amount
// of water in j-th glass of
// i-th row
 
// Returns the amount of water
// in jth glass of ith row
function findWater($i, $j, $X)
{
    // A row number i has maximum
    // i columns. So input column
    // number must be less than i
    if ($j > $i)
    {
        echo "Incorrect Input\n";
        return;
    }
 
    // There will be i*(i+1)/2
    // glasses till ith row
    // (including ith row)
    // and Initialize all glasses
    // as empty
    $glass = array_fill(0, (int)($i *
                       ($i + 1) / 2), 0);
 
    // Put all water
    // in first glass
    $index = 0;
    $glass[$index] = $X;
 
    // Now let the water flow to
    // the downward glasses till
    // the row number is less
    // than or/ equal to i (given 
    // row) correction : X can be
    // zero for side glasses as
    // they have lower rate to fill
    for ($row = 1; $row < $i ; ++$row)
    {
        // Fill glasses in a given
        // row. Number of columns
        // in a row is equal to row number
        for ($col = 1;
             $col <= $row; ++$col, ++$index)
        {
            // Get the water
            // from current glass
            $X = $glass[$index];
 
            // Keep the amount less
            // than or equal to
            // capacity in current glass
            $glass[$index] = ($X >= 1.0) ?
                                     1.0 : $X;
 
            // Get the remaining amount
            $X = ($X >= 1.0) ?
                    ($X - 1) : 0.0;
 
            // Distribute the remaining
            // amount to the down two glasses
            $glass[$index + $row] += (double)($X / 2);
            $glass[$index + $row + 1] += (double)($X / 2);
        }
    }
 
    // The index of jth glass
    // in ith row will
    // be i*(i-1)/2 + j - 1
    return $glass[(int)($i * ($i - 1) /
                          2 + $j - 1)];
}
 
// Driver Code
$i = 2;
$j = 2;
$X = 2.0; // Total amount of water
echo "Amount of water in jth " ,
        "glass of ith row is: ".
       str_pad(findWater($i, $j,
                   $X), 8, '0');
 
// This Code is contributed by mits
?>

Javascript

<script>
 
// Program to find the amount
/// of water in j-th glass
// of i-th row
// Returns the amount of water
// in jth glass of ith row
function findWater(i , j, X)
{
// A row number i has maximum i
// columns. So input column
// number must be less than i
if (j > i)
{
    document.write("Incorrect Input");
}
 
// There will be i*(i+1)/2 glasses
// till ith row (including ith row)
var ll = Math.round((i * (i + 1) ));
glass = Array.from({length: ll+2}, (_, i) => 0.0);
 
// Put all water in first glass
var index = 0;
glass[index] = X;
 
// Now let the water flow to the
// downward glasses till the row
// number is less than or/ equal
// to i (given row)
// correction : X can be zero for side
// glasses as they have lower rate to fill
for (row = 1; row <= i ; ++row)
{
    // Fill glasses in a given row. Number of
    // columns in a row is equal to row number
    for (col = 1;
             col <= row; ++col, ++index)
    {
        // Get the water from current glass
        X = glass[index];
 
        // Keep the amount less than or
        // equal to capacity in current glass
        glass[index] = (X >= 1.0) ? 1.0 : X;
 
        // Get the remaining amount
        X = (X >= 1.0) ? (X - 1) : 0.0;
 
        // Distribute the remaining amount 
        // to the down two glasses
        glass[index + row] += X / 2;
        glass[index + row + 1] += X / 2;
    }
}
 
// The index of jth glass in ith
// row will be i*(i-1)/2 + j - 1
return glass[parseInt((i * (i - 1) /
                   2 + j - 1))];
}
 
// Driver Code
var i = 2, j = 2;
var X = 2.0; // Total amount of water
document.write("Amount of water in jth " +
                     "glass of ith row is: " +
                          findWater(i, j, X));
                           
// This code is contributed by 29AjayKumar
 
</script>

Producción: 

Amount of water in jth glass of ith row is: 0.500000

Complejidad de tiempo: O(i*(i+1)/2) o O(i^2) 
Espacio auxiliar: O(i*(i+1)/2) o O(i^2)

Este artículo fue compilado por Rahul y revisado por el equipo de GeeksforGeeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Método 2 (usando BFS transversal)

discutiremos otro enfoque para este problema. Primero, agregamos un triplete (fila, col, rem-agua) en la cola que indica el valor inicial del primer elemento y llena 1 litro de agua. Luego, simplemente aplicamos bfs, es decir, y agregamos triplete izquierdo (fila + 1, col-1, rem-water) y Triplet derecho (fila + 1, col + 1, rem-water) en la cola con la mitad del agua restante en primer triplete y otra mitad en el siguiente triplete.

A continuación se muestra la implementación de esta solución.

C++

// CPP program for above approach
#include<bits/stdc++.h>
using namespace std;
 
// Program to find the amount 
// of water in j-th glass
// of i-th row
void findWater(float k, int i, int j)
{
     
    // stores how much amount of water
    // present in every glass 
    float dp[i+1][2*i + 1];
    bool vis[i+1][2*i + 1];
     
    // initialize dp and visited arrays
    for(int n=0;n<i+1;n++)
    {
        for(int m=0;m<(2*i+1);m++)
        {
            dp[n][m] = 0;
            vis[n][m] = false;
        }
    }
     
    // store Triplet i.e curr-row , curr-col
    queue<pair<int,int>>q;
    dp[0][i] = k;
     
    // we take the center of the first row for
    // the location of the first glass
    q.push({0,i});
    vis[0][i] = true;
     
    // this while loop runs unless the queue is not empty
    while(!q.empty())
    {
        // First we remove the pair from the queue
        pair<int,int>temp = q.front();
        q.pop();
        int n = temp.first;
        int m = temp.second;
         
         
        // as we know we have  to calculate the
        // amount of water in jth glass
        // of ith row . so first we check if we find solutions
        // for the every glass of i'th row.
        // so, if we have calculated the result
        // then we break the loop
        // and return our answer
        if(i == n)
            break;
             
             
        float x = dp[n][m];
        if(float((x-1.0)/2.0) < 0)
        {
            dp[n+1][m-1] += 0;
            dp[n+1][m+1] += 0;
        }
        else
        {
            dp[n+1][m-1] += float((x-1.0)/2.0);
            dp[n+1][m+1] += float((x-1.0)/2.0);   
        }
        if(vis[n+1][m-1]==false)
        {
            q.push({n+1,m-1});
            vis[n+1][m-1] = true;
        }
        if(vis[n+1][m+1]==false)
        {
            q.push({n+1,m+1});
            vis[n+1][m+1] = true;
        }
    }
    
    if(dp[i-1][2*j-1]>1)
        dp[i-1][2*j-1] = 1.0;
         
    cout<<"Amount of water in jth glass of ith row is: ";
     
    // print the result for jth glass of ith row
    cout<<fixed<<setprecision(6)<<dp[i-1][2*j-1]<<endl;
 
}
 
// Driver Code
int main()
{
     
    //k->water in litres
    float k; 
    cin>>k;
   
    //i->rows  j->cols
    int i,j;
    cin>>i>>j; 
   
    // Function Call 
    findWater(k,i,j);
    return 0;
}
 
 // This code is contributed by Sagar Jangra and Naresh Saharan

Java

// Program to find the amount 
/// of water in j-th glass
// of i-th row
import java.io.*;
import java.util.*;
 
// class Triplet which stores curr row
// curr col and curr rem-water
// of every glass
class Triplet
{
  int row;
  int col;
  double rem_water;
  Triplet(int row,int col,double rem_water)
  {
    this.row=row;this.col=col;this.rem_water=rem_water;
  }
}
 
 
class GFG
{
  // Returns the amount of water
  // in jth glass of ith row
  public static double findWater(int i,int j,int totalWater)
  {
 
    // stores how much amount of water present in every glass  
    double dp[][] = new double[i+1][2*i+1];
 
    // store Triplet i.e curr-row , curr-col, rem-water
    Queue<Triplet> queue = new LinkedList<>();
 
    // we take the center of the first row for
    // the location of the first glass
    queue.add(new Triplet(0,i,totalWater));
 
 
    // this while loop runs unless the queue is not empty
    while(!queue.isEmpty())
    {
      // First we remove the Triplet from the queue
      Triplet curr = queue.remove();
 
      // as we know we have  to calculate the
      // amount of water in jth glass
      // of ith row . so first we check if we find solutions
      // for the every glass of i'th row.
      // so, if we have calculated the result
      // then we break the loop
      // and return our answer
      if(curr.row == i)
        break;
 
      // As we know maximum capacity of every glass
      // is 1 unit. so first we check the capacity
      // of curr glass is full or not.
      if(dp[curr.row][curr.col] != 1.0)
      {
        // calculate the remaining capacity of water for curr glass
        double rem_water = 1-dp[curr.row][curr.col];
 
        // if the remaining capacity of water for curr glass
        // is greater than then the remaining capacity of total
        // water then we put all remaining water into curr glass
        if(rem_water > curr.rem_water)
        {
          dp[curr.row][curr.col] += curr.rem_water;
          curr.rem_water = 0;
        }
        else
        {
          dp[curr.row][curr.col] += rem_water;
          curr.rem_water -= rem_water;
        }
      }
 
      // if remaining capacity of total water is not equal to
      // zero then we add left and right glass of the next row
      // and gives half capacity of total water to both the
      // glass
      if(curr.rem_water != 0)
      {
        queue.add(new Triplet(curr.row + 1,curr.col -
                                  1,curr.rem_water/2.0));
        queue.add(new Triplet(curr.row + 1,curr.col +
                                  1,curr.rem_water/2.0));
      }
    }
 
    // return the result for jth glass of ith row
    return dp[i-1][2*j-1];
  }
 
  // Driver Code
  public static void main (String[] args)
  {
    int i = 2, j = 2;
    int totalWater = 2; // Total amount of water
    System.out.print("Amount of water in jth glass of ith row is:");
    System.out.format("%.6f", findWater(i, j, totalWater));  
  }
 
}
  // this code is contributed by  Naresh Saharan and Sagar Jangra

Python3

# Program to find the amount
# of water in j-th glass of i-th row
 
# class Triplet which stores curr row
# curr col and curr rem-water
# of every glass
class Triplet:
    def __init__(self, row, col, rem_water):
        self.row = row
        self.col = col
        self.rem_water = rem_water
 
# Returns the amount of water
# in jth glass of ith row
def findWater(i, j, totalWater):
   
    # stores how much amount of water present in every glass 
    dp = [[0.0 for i in range(2*i+1)] for j in range(i+1)]
  
    # store Triplet i.e curr-row , curr-col, rem-water
    queue = []
  
    # we take the center of the first row for
    # the location of the first glass
    queue.append(Triplet(0,i,totalWater))
  
    # this while loop runs unless the queue is not empty
    while len(queue) != 0:
      # First we remove the Triplet from the queue
      curr = queue.pop(0)
      # as we know we have  to calculate the
      # amount of water in jth glass
      # of ith row . so first we check if we find solutions
      # for the every glass of i'th row.
      # so, if we have calculated the result
      # then we break the loop
      # and return our answer
      if curr.row == i:
        break
  
      # As we know maximum capacity of every glass
      # is 1 unit. so first we check the capacity
      # of curr glass is full or not.
      if dp[curr.row][curr.col] != 1.0:
         
        # calculate the remaining capacity of water for curr glass
        rem_water = 1-dp[curr.row][curr.col]
  
        # if the remaining capacity of water for curr glass
        # is greater than then the remaining capacity of total
        # water then we put all remaining water into curr glass
        if rem_water > curr.rem_water:
          dp[curr.row][curr.col] += curr.rem_water
          curr.rem_water = 0
        else:
          dp[curr.row][curr.col] += rem_water
          curr.rem_water -= rem_water
  
      # if remaining capacity of total water is not equal to
      # zero then we add left and right glass of the next row
      # and gives half capacity of total water to both the
      # glass
      if curr.rem_water != 0:
        queue.append(Triplet(curr.row + 1,curr.col - 1,(curr.rem_water/2)))
        queue.append(Triplet(curr.row + 1,curr.col + 1,(curr.rem_water/2)))
  
    # return the result for jth glass of ith row
    return dp[i - 1][2 * j - 1]
 
i, j = 2, 2
totalWater = 2 # Total amount of water
print("Amount of water in jth glass of ith row is:", end = "")
print("{0:.6f}".format(findWater(i, j, totalWater)))
 
# This code is contributed by decode2207.

C#

// Program to find the amount
/// of water in j-th glass
using System;
using System.Collections.Generic;
class GFG {
     
    // class Triplet which stores curr row
    // curr col and curr rem-water
    // of every glass
    class Triplet {
        
        public int row, col;
        public double rem_water;
        
        public Triplet(int row, int col, double rem_water)
        {
            this.row = row;
            this.col = col;
            this.rem_water = rem_water;
        }
    }
     
  // Returns the amount of water
  // in jth glass of ith row
  public static double findWater(int i, int j, int totalWater)
  {
  
    // stores how much amount of water present in every glass 
    double[,] dp = new double[i+1,2*i+1];
  
    // store Triplet i.e curr-row , curr-col, rem-water
    List<Triplet> queue = new List<Triplet>();
  
    // we take the center of the first row for
    // the location of the first glass
    queue.Add(new Triplet(0,i,totalWater));
  
  
    // this while loop runs unless the queue is not empty
    while(queue.Count > 0)
    {
      // First we remove the Triplet from the queue
      Triplet curr = queue[0];
      queue.RemoveAt(0);
  
      // as we know we have  to calculate the
      // amount of water in jth glass
      // of ith row . so first we check if we find solutions
      // for the every glass of i'th row.
      // so, if we have calculated the result
      // then we break the loop
      // and return our answer
      if(curr.row == i)
        break;
  
      // As we know maximum capacity of every glass
      // is 1 unit. so first we check the capacity
      // of curr glass is full or not.
      if(dp[curr.row,curr.col] != 1.0)
      {
        // calculate the remaining capacity of water for curr glass
        double rem_water = 1-dp[curr.row,curr.col];
  
        // if the remaining capacity of water for curr glass
        // is greater than then the remaining capacity of total
        // water then we put all remaining water into curr glass
        if(rem_water > curr.rem_water)
        {
          dp[curr.row,curr.col] += curr.rem_water;
          curr.rem_water = 0;
        }
        else
        {
          dp[curr.row,curr.col] += rem_water;
          curr.rem_water -= rem_water;
        }
      }
  
      // if remaining capacity of total water is not equal to
      // zero then we add left and right glass of the next row
      // and gives half capacity of total water to both the
      // glass
      if(curr.rem_water != 0)
      {
        queue.Add(new Triplet(curr.row + 1,curr.col -
                                  1,curr.rem_water/2.0));
        queue.Add(new Triplet(curr.row + 1,curr.col +
                                  1,curr.rem_water/2.0));
      }
    }
  
    // return the result for jth glass of ith row
    return dp[i - 1, 2 * j - 1];
  }
 
  static void Main() {
    int i = 2, j = 2;
    int totalWater = 2; // Total amount of water
    Console.Write("Amount of water in jth glass of ith row is:");
    Console.Write(findWater(i, j, totalWater).ToString("0.000000")); 
  }
}
 
// This code is contributed by divyeshrabadiya07.

Javascript

<script>
// Program to find the amount
/// of water in j-th glass
// of i-th row
 
// class Triplet which stores curr row
// curr col and curr rem-water
// of every glass
class Triplet
{
    constructor(row,col,rem_water)
    {
        this.row=row;
        this.col=col;
        this.rem_water=rem_water;
    }
}
 
// Returns the amount of water
  // in jth glass of ith row
function findWater(i,j,totalWater)
{
    // stores how much amount of water present in every glass 
    let dp = new Array(i+1);
    for(let k=0;k<dp.length;k++)
    {
        dp[k]=new Array((2*i)+1);
        for(let l=0;l<dp[k].length;l++)
        {
            dp[k][l]=0;
        }
         
    }
  
    // store Triplet i.e curr-row , curr-col, rem-water
    let queue = [];
  
    // we take the center of the first row for
    // the location of the first glass
    queue.push(new Triplet(0,i,totalWater));
  
    // this while loop runs unless the queue is not empty
    while(queue.length!=0)
    {
      // First we remove the Triplet from the queue
      let curr = queue.shift();
      // as we know we have  to calculate the
      // amount of water in jth glass
      // of ith row . so first we check if we find solutions
      // for the every glass of i'th row.
      // so, if we have calculated the result
      // then we break the loop
      // and return our answer
      if(curr.row == i)
        break;
  
      // As we know maximum capacity of every glass
      // is 1 unit. so first we check the capacity
      // of curr glass is full or not.
      if(dp[curr.row][curr.col] != 1.0)
      {
        // calculate the remaining capacity of water for curr glass
        let rem_water = 1-dp[curr.row][curr.col];
  
        // if the remaining capacity of water for curr glass
        // is greater than then the remaining capacity of total
        // water then we put all remaining water into curr glass
        if(rem_water > curr.rem_water)
        {
          dp[curr.row][curr.col] += curr.rem_water;
          curr.rem_water = 0;
        }
        else
        {
          dp[curr.row][curr.col] += rem_water;
          curr.rem_water -= rem_water;
        }
      }
  
      // if remaining capacity of total water is not equal to
      // zero then we add left and right glass of the next row
      // and gives half capacity of total water to both the
      // glass
      if(curr.rem_water != 0)
      {
        queue.push(new Triplet(curr.row + 1,curr.col -
                                  1,(curr.rem_water/2)));
        queue.push(new Triplet(curr.row + 1,curr.col +
                                  1,(curr.rem_water/2)));
      }
    }
  
    // return the result for jth glass of ith row
    return dp[i-1][2*j-1];
}
 
// Driver Code
let i = 2, j = 2;
let totalWater = 2; // Total amount of water
document.write("Amount of water in jth glass of ith row is:");
document.write(findWater(i, j, totalWater).toFixed(6)); 
 
// This code is contributed by rag2127
</script>
Producción

Amount of water in jth glass of ith row is:0.500000

Complejidad del tiempo:   O(2^i)

Complejidad espacial:   O(i^2)
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *