Find the winner of the game with N piles of boxes

14 Jun, 2022
Given N piles containing White(W) and Black(B) boxes only, two players A and B play a game. Player A may remove any number of boxes from the top of the pile having the topmost box White, and Player B may remove any number of boxes from the top of the pile having the topmost box Black. If there is a pile with top as W, then player A has removed one or more boxes. Similarly, if there is a pile with top as B, then player B has to remove one or more boxes. They play alternating, with the player A first to move. Both players play optimally. The task is to find the winner of the game (who cannot make the last move). Player last to move loses the game.Examples:  
Input: N = 2 WBW, BWB Output: A Player A can remove all boxes from pile 1. Now player B has to make a choice from pile 2. Whatever choice player B makes, he/she has to make the last move.Input: N = 3 WWWW, WBWB, WBBW Output: B
 
Approach: The game theory problems, where the player who makes the last move lose the game, are called Misère Nim’s Game.  
If there are consecutive occurrences of the same box in any pile, we can simply replace them with one copy of the same box, since it is optimal to remove all occurrences of the box present at the top. So, we can compress all piles to get the pile of form BWBWBW or WBWBWB.Now, suppose there’s a pile, which have topmost box differing from its bottom-most box, we can prove that the answer remains the same even without this pile, because if one player makes a move on this pile, the other player makes the next move by removing a box from the same pile, resulting in exactly same position for the first player.If a pile has both top and bottom-most box as the same, It requires one or the player to make one extra move. So, just count the number of extra move each player has to make. The player which runs off out extra moves first wins the game.
If there are consecutive occurrences of the same box in any pile, we can simply replace them with one copy of the same box, since it is optimal to remove all occurrences of the box present at the top. So, we can compress all piles to get the pile of form BWBWBW or WBWBWB.
Now, suppose there’s a pile, which have topmost box differing from its bottom-most box, we can prove that the answer remains the same even without this pile, because if one player makes a move on this pile, the other player makes the next move by removing a box from the same pile, resulting in exactly same position for the first player.
If a pile has both top and bottom-most box as the same, It requires one or the player to make one extra move. So, just count the number of extra move each player has to make. The player which runs off out extra moves first wins the game.
Below is the implementation of the above approach. 
C++
Java
Python3
C#
Javascript
// Program to find winner of the game#include <bits/stdc++.h>using namespace std; // Function to return find winner of gamestring Winner(int n, string pile[]){     int a = 0, b = 0;    for (int i = 0; i < n; ++i) {        int l = pile[i].length();         // Piles begins and ends with White box 'W'        if (pile[i][0] == pile[i][l - 1] && pile[i][0] == 'W')            a++;         // Piles begins and ends with Black box 'B'        if (pile[i][0] == pile[i][l - 1] && pile[i][0] == 'B')            b++;    }    if (a <= b)        return "A";    else        return "B";} // Driver codeint main(){     int n = 2;    string pile[n] = { "WBW", "BWB" };     // function to print required answer    cout << Winner(n, pile);     return 0;}
// Program to find winner of the gameclass GFG{ // Function to return find winner of gamestatic String Winner(int n, String []pile){     int a = 0, b = 0;    for (int i = 0; i < n; ++i)    {        int l = pile[i].length();         // Piles begins and ends with White box 'W'        if (pile[i].charAt(0) == pile[i].charAt(l - 1) &&            pile[i].charAt(0) == 'W')            a++;         // Piles begins and ends with Black box 'B'        if (pile[i].charAt(0) == pile[i].charAt(l - 1) &&            pile[i].charAt(0) == 'B')            b++;    }    if (a <= b)        return "A";    else        return "B";} // Driver codepublic static void main(String[] args){    int n = 2;    String pile[] = { "WBW", "BWB" };     // function to print required answer    System.out.println(Winner(n, pile));}} // This code is contributed by Rajput-Ji
# Python3 code to find winner of the game # Function to return find winner of gamedef Winner(n, pile):     a, b = 0, 0    for i in range(0, n):        l = len(pile[i])         # Piles begins and ends with White box 'W'        if (pile[i][0] == pile[i][l - 1] and            pile[i][0] == 'W'):            a += 1         # Piles begins and ends with Black box 'B'        if (pile[i][0] == pile[i][l - 1] and            pile[i][0] == 'B'):            b += 1         if a <= b:        return "A"    else:        return "B" # Driver codeif __name__ == "__main__":     n = 2    pile = ["WBW", "BWB"]     # function to print required answer    print(Winner(n, pile)) # This code is contributed by Rituraj Jain
// Program to find winner of the gameusing System;     class GFG{ // Function to return find winner of gamestatic String Winner(int n, String []pile){    int a = 0, b = 0;    for (int i = 0; i < n; ++i)    {        int l = pile[i].Length;         // Piles begins and ends with White box 'W'        if (pile[i][0] == pile[i][l - 1] &&            pile[i][0] == 'W')            a++;         // Piles begins and ends with Black box 'B'        if (pile[i][0] == pile[i][l - 1] &&            pile[i][0] == 'B')            b++;    }    if (a <= b)        return "A";    else        return "B";} // Driver codepublic static void Main(String[] args){    int n = 2;    String []pile = { "WBW", "BWB" };     // function to print required answer    Console.WriteLine(Winner(n, pile));}} // This code is contributed by Princi Singh
<script> // Program to find winner of the game // Function to return find winner of gamefunction Winner(n, pile){     var a = 0, b = 0;    for (var i = 0; i < n; ++i) {        var l = pile[i].length;         // Piles begins and ends with White box 'W'        if (pile[i][0] == pile[i][l - 1] && pile[i][0] == 'W')            a++;         // Piles begins and ends with Black box 'B'        if (pile[i][0] == pile[i][l - 1] && pile[i][0] == 'B')            b++;    }    if (a <= b)        return "A";    else        return "B";} // Driver codevar n = 2;var pile = ["WBW", "BWB"]; // function to print required answerdocument.write( Winner(n, pile)); // This code is contributed by noob2000.</script>
A
 
Time Complexity: O(N)
Auxiliary Space : O(1) 
rituraj_jain
Rajput-Ji
princi singh
noob2000
devendrasalunke
Game Theory
Game Theory
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Chessboard Pawn-Pawn game
Josephus Problem | (Iterative Solution)
Game Theory (Normal-form Game) | Set 4 (Dominance Property-Pure Strategy)
Minesweeper Solver
Classification of Algorithms with Examples
Zero-Sum Game
Find the player who will win by choosing a number in range [1, K] with sum total N
Game Theory (Normal-form Game) | Set 6 (Graphical Method [2 X N] Game)
Maximum cells attacked by Rook or Bishop in given Chessboard
Game Development with Unity | Introduction