Problem Sets on Game Theory
This post contains a couple of well-defined problems on game theory.
Coins in a Line (394):
public:
/**
* @param n: An integer
* @return: A boolean which equals to true if the first player will win
*/
bool isWinning(int playerId, int coinsLeft){
if(occurMapArr[playerId].find(coinsLeft) != occurMapArr[playerId].end()){
return occurMapArr[playerId][coinsLeft];
} else if(coinsLeft<=0){
return false;
} else if(coinsLeft<=2){
return true;
} else if(playerId==0){
occurMapArr[playerId][coinsLeft] = !isWinning(1, coinsLeft-1) || !isWinning(1, coinsLeft-2);
return occurMapArr[playerId][coinsLeft];
} else {
occurMapArr[playerId][coinsLeft] = !isWinning(0, coinsLeft-1) || !isWinning(0,coinsLeft-2);
return occurMapArr[playerId][coinsLeft];
}
}
bool firstWillWin(int n) {
// write your code here
return isWinning(0,n);
}
private:
vector< map<int, bool>> occurMapArr = vector<map<int, bool>>(2);
Coins in a Line II (395):
public:
/**
* @param values: a vector of integers
* @return: a boolean which equals to true if the first player will win
*/
bool isWinning(int playerId, vector<int> &values, int index, int value){
if (occurMapArray[playerId].find(index) != occurMapArray[playerId].end()){
return occurMapArray[playerId][index];
}else if(index >= values.size()) {
if(playerId==0 && value>=0){
return true;
} else if(playerId==1 && value<=0){
return true;
} else{
return false;
}
} else {
if(playerId==0){
if(index+1 < values.size()){
occurMapArray[playerId][index] = !isWinning(1, values, index+1, value+values[index]) ||
!isWinning(1, values, index+2, value+values[index]+values[index+1]);
} else {
occurMapArray[playerId][index] = !isWinning(1, values, index+1, value+values[index]);
}
return occurMapArray[playerId][index];
} else {
if(index+1 < values.size()){
occurMapArray[playerId][index] = !isWinning(0, values, index+1, value-values[index]) ||
!isWinning(0, values, index+2, value-values[index]-values[index+1]);
} else {
occurMapArray[playerId][index] = !isWinning(0, values, index+1, value-values[index]);
}
return occurMapArray[playerId][index];
}
}
}
bool firstWillWin(vector<int> &values) {
// write your code here
return isWinning(0, values, 0, 0);
}
private:
vector<map<int,bool>> occurMapArray = vector<map<int,bool>>(2);
Bash Game II (3735):
bool canWinBash(vector<int> &rocks) {
// --- write your code here ---
int nimSum = 0;
for(int &val : rocks){
nimSum ^= val;
}
return nimSum!=0;
}
Written on July 14, 2025