給定乙個有n個節點的有向無環圖,圖中某些節點上有棋子,兩名玩家交替移動棋子。
玩家每一步可將任意一顆棋子沿一條有向邊移動到另乙個點,無法移動者輸掉遊戲。
對於給定的圖和棋子初始位置,雙方都會採取最優的行動,詢問先手必勝還是先手必敗。
第一行,三個整數n、m、k, n表示圖中節點總數,m表示圖中邊的條數,k表示棋子的個數
接下來m行,每行兩個整數x,y表示有一條邊從x出發指向y。
接下來一行,k個空格間隔的整數,表示初始時,棋子所在的節點編號
若先手勝,輸出"win",否則輸出"lose"
6 8 4
2 12 41 4
1 54 5
1 33 5
3 61 2 4 6
winn<=2000,m<=6000,1<=k<=n
一道博弈題。sg函式的模板。
值得注意的就是博弈的一些定理了,但是本蒟蒻現在都還沒有弄明白,所以也就不能說出原理了。
讀入資料並建圖之後,我們將每乙個出度為0的點的sg函式的值設定為0(別問我為什麼,和某個神秘的mex函式有關)。
相應的,我們可以用dfs的方式的出每乙個點的sg函式值。最後整個遊戲的sg函式值就是每乙個棋子的sg值的異或和。(sg定理)。當sg(g)=0時,先手必敗。
下面附上**
#include#include#includeusing namespace std;
struct roadroad[10005];
int h[2005],cnt=0;
inline void add(int x,int y)
int prep[2005];
int sg[2005];
int st[2005];
int mark[2005];
int judge[2005];
int n,m,k;
int ans;
inline void make_sg(int v)
for(i=0;i<=n;i++)
} make_sg(prep[v]);
return ;
} int main()
for(i=1;i<=n;i++)
} ans=0;
for(i=1;i<=k;i++)
if(ans)cout<<"win";
else cout<<"lose";
return 0;
}
移棋子遊戲
給定乙個有n個節點的有向無環圖,圖中某些節點上有棋子,兩名玩家交替移動棋子。玩家每一步可將任意一顆棋子沿一條有向邊移動到另乙個點,無法移動者輸掉遊戲。對於給定的圖和棋子初始位置,雙方都會採取最優的行動,詢問先手必勝還是先手必敗。第一行,三個整數n,m,k,n表示圖中節點總數,m表示圖中邊的條數,k表...
博弈論 取棋子遊戲
題目大意 有兩堆石子,各為 n m 個,甲乙兩人輪流取石子,每次可以從任意一堆裡取走任意多個石子,也可以從兩堆中取走相同數量的石子,但不能不取。取走最後乙個石子的人為贏家。給出初始狀態,問先手有無必勝策略。資料範圍 rqnoj 256 1 n m 10000。poj 1067 1 n m 1,000...
1534 棋子遊戲 博弈論
1534 棋子遊戲 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 還有一些其它的限制,他們不能把棋子移動到x或y為負的座標,或者移動到已經被對手佔據的座標。最先到達 0,0 的人獲勝。現在給定他們棋子的座標,判斷一下誰會獲勝。input 單...