博弈 移棋子遊戲 BSOI3969

2021-07-27 17:27:45 字數 1232 閱讀 5757

給定乙個有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 單...