博弈論—NP圖法kiki's game HDU
題解:這一題用NP圖來進行求解,分別畫出 偶X奇,偶X偶,奇X奇的矩陣來找出規律來即可求出結果。 NP圖的畫法:
以下內容為借鑑,因為寫的很好,沒啥要補充的。 博弈論:組合博弈 * 必敗點(P點) :前一個選手(Previous player)將取勝的位置稱為必敗點。 * 必勝點(N點) :下一個選手(Next player)將取勝的位置稱為必勝點。 * 必敗(必勝)點的屬性: * (1) 所有終結點是必敗點(P點); * (2) 從任何必勝點(N點)操作,至少有一種方法可以進入必敗點(P點); * (3)無論如何操作, 從必敗點(P點)都只能進入必勝點(N點). * 由上面的屬性得到該題的演算法: * 步驟1:將所有終結位置標記為必敗點(P點); * 步驟2: 將所有一步操作能進入必敗點(P點)的位置標記為必勝點(N點) * 步驟3:如果從某個點開始的所有一步操作都只能進入必勝點(N點) ,則將該點標記為必敗點(P點) ; * 步驟4: 如果在步驟3未能找到新的必敗(P點),則演算法終止;否則,返回到步驟2。
關於博弈問題,較為常用的是P/N圖分析法
p n p n p n p n n n n n n n n n p n p n p n p n n n n n n n n n p n p n p n p n n n n n n n n n p n p n p n p n
實際上就是按照規則畫圖;有以下三條規則: number one :每個圖的末狀態均為必敗點P number two: 所有能夠一步到達必敗點的都是必勝點N number three: 所有能夠一步到達必勝點的都是必敗點 P 畫圖的時候,選定對角線定點裡面的那個點位末狀態,題上的說明,那麼一般找的規則就是從最底邊上,還有最開始的那一列開始確定P還是N點,這樣很方便的看出,當行列都是奇數的時候,那麼一定會必敗點。
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
#define LL long long int
using namespace std;
int n,m,sg[2001][2001];
int main()
{
while(~scanf("%d%d",&n,&m)&&n+m!=0)
{
if(n%2==0||m%2 == 0) cout<<"Wonderful!"<<endl;
else
cout<<"What a pity!"<<endl;
}
return 0;
}