Find the winner of the game with N piles of boxes (original) (raw)
Last Updated : 11 Feb, 2025
Given an array of strings arr[] of size **n representing n **piles containing white (W) and Black (B) boxes. Two players are playing a game with these piles, Player1 and Player2. Both take turns with **Player1 starting first. In their respective turn, **Player1 can **remove any number of **boxes from the **top of the pile with the **topmost box **white (W) and **Player2 can **remove boxes from the pile with the **topmost box **black (B). The game **ends when the **player has **no boxes to remove and the **player who made the **last move loses. The task is to **find the **winner of the game, given that both the players play optimally and alternatively.
**Note: If there are no piles of boxes, Player2 wins the game.
**Examples:
**Input: arr[] = {"WBW", "BWB"}
**Output: Player1
**Explanation: Player1 can remove all boxes from pile 1. Now Player2 has to make a choice from pile 2. Whatever choice Player2 makes, he/she has to make the last move.**Input: arr[] = {"WWWW", "WBWB", "WBBW"}
**Output: Player2
**Approach:
If a pile has consecutive **identical boxes, **compress it to a simplified form like "**BWB" or "**WBW", as it’s **optimal to remove **all identical top **boxes.
For piles where the **top and **bottom boxes **differ, these **do not affect the **outcome. When one player makes a move on such a pile, the other player can **mirror it, leaving the first player in the **same position.
For piles where the **top and **bottom boxes are the **same, they require an **extra move. **Count the extra **moves each player must make. Player with **less count of such moves **wins the game.
C++ `
// C++ program to find the winner // of game of N piles of boxes #include <bits/stdc++.h> using namespace std;
// Function to find the winner of the game void findWinner(int n, vector &arr) {
int a = 0, b = 0;
for (int i = 0; i < n; ++i) {
int l = arr[i].length();
// If pile begins and ends with White box
if (arr[i][0] == arr[i][l - 1]
&& arr[i][0] == 'W')
a++;
// If pile begins and ends with Black
if (arr[i][0] == arr[i][l - 1]
&& arr[i][0] == 'B')
b++;
}
if (a <= b)
cout<<"Player1";
else
cout<<"Player2";}
int main() { int n = 3; vector arr = { "WWWW", "WBWB", "WBBW" }; findWinner(n, arr); return 0; }
C
// C program to find the winner // of game of N piles of boxes #include <stdio.h> #include <string.h>
// Function to find the winner of the game void findWinner(int n, char arr[][100]) {
int a = 0, b = 0;
for (int i = 0; i < n; ++i) {
int l = strlen(arr[i]);
// If pile begins and ends with White box
if (arr[i][0] == arr[i][l - 1]
&& arr[i][0] == 'W')
a++;
// If pile begins and ends with Black
if (arr[i][0] == arr[i][l - 1]
&& arr[i][0] == 'B')
b++;
}
if (a <= b)
printf("Player1");
else
printf("Player2");}
int main() { int n = 3; char arr[3][100] = { "WWWW", "WBWB", "WBBW" }; findWinner(n, arr); return 0; }
Java
// Java program to find the winner // of game of N piles of boxes class GfG {
// Function to find the winner of the game
static void findWinner(int n, String[] arr) {
int a = 0, b = 0;
for (int i = 0; i < n; ++i) {
int l = arr[i].length();
// If pile begins and ends with White box
if (arr[i].charAt(0) == arr[i].charAt(l - 1)
&& arr[i].charAt(0) == 'W')
a++;
// If pile begins and ends with Black
if (arr[i].charAt(0) == arr[i].charAt(l - 1)
&& arr[i].charAt(0) == 'B')
b++;
}
if (a <= b)
System.out.print("Player1");
else
System.out.print("Player2");
}
public static void main(String[] args) {
int n = 3;
String[] arr = {"WWWW", "WBWB", "WBBW"};
findWinner(n, arr);
}}
Python
Python program to find the winner
of game of N piles of boxes
Function to find the winner of the game
def findWinner(n, arr): a = 0 b = 0 for i in range(n): l = len(arr[i])
# If pile begins and ends with White box
if arr[i][0] == arr[i][l - 1] and arr[i][0] == 'W':
a += 1
# If pile begins and ends with Black
if arr[i][0] == arr[i][l - 1] and arr[i][0] == 'B':
b += 1
if a <= b:
print("Player1")
else:
print("Player2")if name == "main": n = 3 arr = ["WWWW", "WBWB", "WBBW"] findWinner(n, arr)
C#
// C# program to find the winner using System;
class GfG {
// Function to find the winner of the game
static void FindWinner(int n, string[] arr) {
int a = 0, b = 0;
for (int i = 0; i < n; ++i) {
int l = arr[i].Length;
// If pile begins and ends with White box
if (arr[i][0] == arr[i][l - 1] && arr[i][0] == 'W')
a++;
// If pile begins and ends with Black
if (arr[i][0] == arr[i][l - 1] && arr[i][0] == 'B')
b++;
}
if (a <= b)
Console.Write("Player1");
else
Console.Write("Player2");
}
public static void Main(string[] args) {
int n = 3;
string[] arr = {"WWWW", "WBWB", "WBBW"};
FindWinner(n, arr);
}}
JavaScript
// JavaScript program to find the winner // of game of N piles of boxes
// Function to find the winner of the game function findWinner(n, arr) { let a = 0, b = 0; for (let i = 0; i < n; ++i) { let l = arr[i].length;
// If pile begins and ends with White box
if (arr[i][0] === arr[i][l - 1]
&& arr[i][0] === 'W')
a++;
// If pile begins and ends with Black
if (arr[i][0] === arr[i][l - 1]
&& arr[i][0] === 'B')
b++;
}
if (a <= b)
console.log("Player1");
else
console.log("Player2");}
const n = 3; const arr = ["WWWW", "WBWB", "WBBW"]; findWinner(n, arr);
`
**Time Complexity: O(n)
**Auxiliary Space : O(1)