# 題目: UVa 11489 - Integer Game
# 題目說明
有兩位玩家S與T要玩一個回合制遊戲,由S先行動
從N開始,每位玩家要輪流移除一個字元的數字
條件為:
- 移除後所有數字相加需要為
3的倍數 - 當剩餘一個數字時,可以直接移除
誰先不能移除數字誰就輸了
例如當N = 1234
可以移除4,會使得剩下的數字1 + 2 + 3 = 6為3的倍數
也可以移除1,會使得剩下的數字2 + 3 + 4 = 9也為3的倍數
INPUT:
第一行輸入一個整數T,代表測資數
每筆測資輸入一個整數N
OUTPUT:
輸出S(S贏)或T(T贏)
# 解題方法
先將N存入一個vector<int> num,每個字元一位
設一個變數sum為num的數字合
判斷sum - num[i]是否為3的倍數,是則移除那個數字並換另一個玩家行動
重複做至當num剩餘一個數字或sum - num[i]沒有找到3的倍數
# 參考程式碼
#include <iostream>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T;
string N;
cin >> T;
for (int cases = 1; cases <= T; ++cases)
{
bool s_win = false;
vector<int> num;
cin >> N;
for (auto& c : N) num.emplace_back(c - '0');
while (1)
{
int sum = 0;
for (auto& i : num) sum += i;
int i = 0;
for (; i < num.size(); ++i) if ((sum - num[i]) % 3 == 0)
{
s_win ^= 1;
num.erase(num.begin() + i);
break;
}
if (num.size() == 1)
{
s_win ^= 1;
break;
}
if (i == num.size()) break;
}
cout << "Case " << cases << ": " << (s_win ? "S" : "T") << "\n";
}
return 0;
}