大白書 2.4節 組合遊戲
博弈論筆記:
1)必勝必敗狀態:
a)乙個狀態為必勝狀態,充要條件是後續狀態有乙個必敗狀態
b)乙個狀態為必敗狀態,充要條件是後續狀態全是必勝狀態
2)sg函式
a)定義:sg[i] =
b)乙個狀態為必敗狀態,當且僅當這個狀態的sg值為0
c)通常可以用暴力的方法求出參見第二道題,資料過大時參見第一道題
3)nim和與sg函式的應用
a)nim和:乙個父遊戲的狀態等於子遊戲狀態的異或和。
b)乙個遊戲的sg值,等於所有子遊戲的sg值的異或和
uva 1146
看的題解
找規律,n為偶數sg值為n/2,奇數為sg[i] = sg[i/2]
原始碼:
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ll long long
ll sg(ll u)
int main()
if(state == 0) printf("no\n");
else
printf("yes\n");
}return
0;}
uva 10561
看的題解和別人**
對於乙個x,存在控制區間即[x-2,x+2],在這個區間內放x就輸了。
然後根據這個性質得出sg函式以及的特判輸贏的情況。
然後列舉每個不在控制區間、不為x的位置變成1後sg是否為0,得出所有位置的解。
原始碼:
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 200 + 5;
int vis[maxn];
int sg[maxn];
void init()
vis[sg[l] ^ sg[r]] = 1;
}for(int j = 0 ; ; j++)}}
}char op[maxn];
int ts[maxn], s[maxn];
int n;
vector
ans;
bool check1()
return ok;
}int sg()
else cnt++;
}// printf("cnt = %d\n", cnt);
state ^= sg[cnt];
// printf("state = %d\n", state);
return state;
}int main()
for(int i = 1 ; i <= n ; i++)}}
if(check1())
printf("\n");
continue;
}else
if(sg() == 0)
else
}printf("winning\n");
int f = 1;
for(vector
::iterator it = ans.begin() ; it != ans.end() ; it++)
printf("\n");}}
return
0;}
組合遊戲與博弈論 學習筆記
i was standing all alone against the world outside 忘記在 看到,很適合用這句歌詞來描述john nash 1.組合遊戲略述 sg遊戲的若干拓展及變形 賈志豪 2.上面那篇 裡的參考文獻.遊戲有兩個人參與,二者輪流做出決策。且這兩個人的決策都對自己最...
魔法遊戲 博弈論
題目大意 給一顆樹,每個位置有乙個權值,每次乙個人可以選擇森林中的某棵樹的根節點,設其權值為a aa,那麼這個人可以選擇乙個k 2,a 1 k in 2,a 1 k 2,a 1 然後讓a aa變成 ak left lfloor frac ak right rfloor ka 如果乙個點權值變為0那麼...
博弈論 Nim遊戲
這種遊戲稱為nim博弈,遊戲過程中面臨的狀態成為局面。n im nimni m博弈不存在平局,只有先手必勝和先手必敗兩種情況。定理nim 博弈先手 必勝,當 且僅當a 1xora2 xor xoran 0nim博弈先手必勝,當且僅當 a 1 texta 2 text cdots text a n n...