多邊形遊戲(博弈)

2021-08-06 04:02:51 字數 964 閱讀 4987

問題描述:

多邊形遊戲是乙個雙人遊戲。遊戲在乙個有n個頂點的凸多邊形上進行,這個凸多邊形的n-3條對角線將多邊形分成n-2個三角形,三角形中的乙個被染成黑色,其餘是白色。雙方輪流進行遊戲,當輪到一方時,他必須沿著畫好的對角線,從多邊形上切下乙個三角形。切下黑色三角形的一方獲勝。

輸入多組測試資料。每組測試資料第一行n,表示頂點數。多邊形的頂點從0到n-1順時針標號,接著的n-2行描述組成多邊形的三角形,且第一行給出的是黑色三角形的描述。當n=0時表示輸入結束。

輸出對每組測試資料,輸出yes或no:yes,表示先走的一方有必勝策略;no,表示先走的一方沒有必勝策略。

樣例0 1 2

2 4 3

4 2 0

0 5 4

yes思路:本題初看似乎很複雜,設計那麼多的邊和三角形,但想想,可以將圖形進行轉換,嘗試將多邊形的每個三角形看成乙個結點,有公共邊的三角形所對應的頂點之間連一條邊,則所給的圖形可以看作是有n-2個結點,n-3條邊的乙個無向圖g。顯然,g構成一棵樹t,把黑色三角形對應的結點看作樹t的根,則樹t最多有三棵子樹。

接下來考慮必勝策略,顯然,若要切掉根結點,則必須先將根的子樹切到只剩一根。需要考慮的只是子樹的結點個數,用非負整數(x,y,z)表示根的三棵子樹的結點個數,不妨設x<=y<=z,則顯然z>0。

(1)y=0,則x=0,為必勝狀態;

(2)y>0,則最終結局必是(1,0,0),(0,1,0),(0,0,1)的一種;

顯然,在(2)情況下,要想讓先走的贏,x+y+z為奇數。

演算法實現:主要的問題在於x,y,z的求取。由於多邊形為順時針編號,設黑三角形的編號為(i,j,k),假設滿足i

**:int main()

{ while(cin>>n&&n)

{cin>>i>>j>>k;

n-=3;

while(n--)

cin>>a>>b>>c;

swap(i,j,k);//排序:i

多邊形遊戲

07 多邊形遊戲 描述乙個多邊形,開始有n個頂點。每個頂點被賦予乙個正整數值,每條邊被賦予乙個運算子 或 所有邊依次用整數從1到n編號。現在來玩乙個遊戲,該遊戲共有n步 最後,所有邊都被刪除,只剩乙個頂點,遊戲結束。遊戲得分就是所剩頂點上的整數值。那麼這個整數值最大為多少?關於輸入 第一行為多邊形的...

多邊形遊戲

該問題用動態規劃中的最優子結構來解決,當把一條邊去除除后,再把它拉直,那麼這個問題就最後可以變成一條鏈。那麼就和以前寫的矩陣連乘問題和凸多邊形最優三角剖分相似,最後要求的是這個鏈的表示式算式結果的最大值。於是我們就可以想到可以用陣列p i j 來表示從點i開始,鏈長為j的算術表示式的最大值,用v i...

多邊形遊戲問題

問題描述 多邊形遊戲是乙個單人玩的遊戲,開始時有乙個由n個頂點構成的多邊形。每個頂點被賦予乙個整數值,每條邊被賦予乙個運算子 或 所有邊依次用整數從1到n編號。遊戲第1步,將一條邊刪除。隨後n 1步按以下方式操作 1 選擇一條邊e以及由e連線著的2個頂點v1和v2 2 用乙個新的頂點取代邊e以及由e...