Number of Laser Beams in a Bank

Updated on 14 July, 2025
Number of Laser Beams in a Bank header image

Problem Statement

In the context of a security-enhanced bank, anti-theft devices are organized within a 2-dimensional grid, represented by a binary string array, bank. Each string element within the array corresponds to a row in the bank’s floor plan, where '0' indicates an empty space and '1' denotes the presence of a security device.

The task is to determine the number of laser beams activated between pairs of security devices under specific conditions:

  1. The devices must be located on distinct rows.
  2. No other security devices are present in the rows that lie between this pair.

Laser beams generated under these rules do not intersect or affect each other.

You are required to return the total count of such laser beams considering the layout details provided in bank.

Examples

Example 1

Input:

bank = ["011001","000000","010100","001000"]

Output:

8

Explanation:

Between each of the following device pairs, there is one beam. In total, there are 8 beams:
* bank[0][1] -- bank[2][1]
* bank[0][1] -- bank[2][3]
* bank[0][2] -- bank[2][1]
* bank[0][2] -- bank[2][3]
* bank[0][5] -- bank[2][1]
* bank[0][5] -- bank[2][3]
* bank[2][1] -- bank[3][2]
* bank[2][3] -- bank[3][2]
Note that there is no beam between any device on the 0th row with any on the 3rd row.
This is because the 2nd row contains security devices, which breaks the second condition.

Example 2

Input:

bank = ["000","111","000"]

Output:

0

Explanation:

There does not exist two devices located on two different rows.

Constraints

  • m == bank.length
  • n == bank[i].length
  • 1 <= m, n <= 500
  • bank[i][j] is either '0' or '1'.

Approach and Intuition

The strategy involves several key steps to compute the number of effective laser beams:

  1. Identifying Active Rows:

    • First, identify which rows have at least one security device (rows where any column has a '1'). This helps in narrowing down the pairs of rows to consider for possible beams.
  2. Calculating Beams Between Pairs of Rows:

    • Count the actual number of security devices in each of the identified rows.
    • For any pair of rows that has no security devices in the intermediate rows, calculate the number of beams by multiplying the number of devices in the two rows. This multiplication arises because each device in the first row can potentially connect with each device in the second row if the conditions are satisfied.
  3. Incremental Counting:

    • For optimization, keep a running sum of devices in all previous rows that satisfied the conditions as you iterate through the bank. This prevents the need for repeated calculation and minimizes required operations, important given the constraint limits of up to 500x500 matrix size.

By carefully counting and combining the potential beams from qualifying pairs of rows using the above strategy, one can efficiently determine the total number of laser beams active in the bank floor plan.

Solutions

  • C++
cpp
class Solution {
public:
    int countBeams(vector<string>& bank) {
        int previous = 0, totalBeams = 0;
            
        for (string row : bank) {
            int onesCount = 0;
            for (char bit : row) {
                if (bit == '1') {
                    onesCount++;
                }
            }
            if (onesCount > 0) {
                totalBeams += (previous * onesCount);
                previous = onesCount;
            }
        }
            
        return totalBeams;
    }
};

The given C++ code defines a solution for calculating the total number of laser beams in a bank where each row of the bank can have multiple security devices represented as '1's in a string. Each '1' can emit a laser beam to any '1' in the vertically adjacent row. The process followed by the code includes:

  • Initializing two integers, previous and totalBeams, to keep track of the number of devices in the previous row and the cumulative total of beams, respectively.
  • Iteratively processing each row in the bank:
    • Count the number of '1's in the current row which represent the active devices.
    • If there are any devices (i.e., onesCount is more than zero), multiply this count by the count of devices in the previous row (previous * onesCount) to calculate the beams formed between this row and the previous row. Add this value to totalBeams.
    • Update previous to the current onesCount for calculations in the subsequent iterations.
  • Finally, returning the value of totalBeams which is the total number of beams formed between all rows in the bank.

This solution efficiently calculates the required number of laser beams using simple arithmetic operations and is suitable for varying sizes of input data, provided as rows in the vector bank. This approach ensures an O(n*m) complexity, where n is the number of rows and m is the average number of characters per row.

  • Java
java
class Solution {
  public int calculateBeams(String[] bank) {
    int previous = 0, total = 0;
    
    for (String row: bank) {
      int countOnes = 0;
      for (int j = 0; j < row.length(); j++)
        if (row.charAt(j) == '1')
          countOnes++;
    
      if (countOnes > 0) {
        total += previous * countOnes;
        previous = countOnes;
      }
    }
    
    return total;
  }
}

This solution addresses the problem of calculating the number of laser beams in a bank. Given a String[] array where each string represents a row of the bank, and each character in the string (either '0' or '1') signifies whether a security device is present at that location ('1' indicates presence), the objective is to determine how many laser beams would be formed between the devices across rows.

Here's a breakdown of the solution using Java:

  • Initialize two integers, previous and total, to zero. previous holds the count of devices ('1's) in the prior row, and total will accumulate the number of beams formed.

  • Iterate through each row in the bank array:

    • For each row, count the number of '1's which represent devices. This is done using a nested for loop that checks each character in the string.

    • If the current row has one or more devices, calculate beams formed with the devices from the previous row using the formula previous * countOnes. Add this number to total.

    • Update previous with the count of devices from the current row to use in the next iteration for beam calculations.

  • Return the value of total, which represents the total number of laser beams formed in the bank.

This algorithm efficiently calculates the number of beams by leveraging a simple count mechanism for devices in each row and cumulatively adding up the beams as it moves through the rows. The solution ensures that beams are only counted between rows that have devices, and it handles rows with no devices by simply skipping them in the beam calculation.

Comments

No comments yet.