兩人分 n≤10 張牌(1..n 各一張),輪流出牌比大,大者將兩張牌置於自己牌堆底(先對手牌後自己牌)。一方牌盡則輸。求回合數與贏家,或判定無限循環(輸出 -1)。
queue 表示雙方牌堆。set, queue>> 記錄已見狀態(C++ queue 支持比較運算符)。10! 狀態,但實際極快收斂,官方說明步數不超過 1e6。
queue q[2];
set, queue>> seen;
int main() {
int n; while(cin>>n) {
seen.clear(); q[0]=q[1]=queue();
for(int i=0;i<2;i++) { int k,x; cin>>k; while(k--){cin>>x;q[i].push(x);} }
seen.insert({q[0],q[1]});
int step=0;
while(!q[0].empty() && !q[1].empty()) {
int a=q[0].front();q[0].pop();
int b=q[1].front();q[1].pop();
if(a
狀態數上界 n! * (n+1)(分割點),n=10 時 ~4e7,但實際測試極快。集合查找 O(log S),S 為已見狀態數。