【博弈论】取火柴游戏
生活随笔
收集整理的這篇文章主要介紹了
【博弈论】取火柴游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
取火柴游戲
時間限制: 1 Sec內存限制: 128 MB
題目描述
輸入k及k個整數n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根數為ni;接著便是你和計算機取火柴棒的對弈游戲。取的規則如下:每次可以從一堆中取走若干根火柴,也可以一堆全部取走,但不允許跨堆取,也不允許不取。
誰取走最后一根火柴為勝利者。
例如:k=2,n1=n2=2,A代表你,P代表計算機,若決定A先取:
A:(2,2)→(1,2) {從一堆中取一根}
P:(1,2)→(1,1) {從另一堆中取一根}
A:(1,1)→(1,0)
P:(1,0)→ (0,0) {P勝利}
如果決定A后取:
P:(2,2)→(2,0)
A:(2,0)→ 0,0) {A勝利}
又如k=3,n1=1,n2=2,n3=3,A決定后取:
P:(1,2,3)→(0,2,3)
A:(0,2,3)→(0,2,2)
A已將游戲歸結為(2,2)的情況,不管P如何取A都必勝。
編一個程序,在給出初始狀態之后,判斷是先取必勝還是先取必敗,如果是先取必勝,請輸
出第一次該如何取。如果是先取必敗,則輸出“lose”。
輸入
輸入k及k個整數n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根數為ni;
輸出
判斷是先取必勝還是先取必敗,如果是先取必勝,請輸出第一次該如何取。如果是先取必敗,則輸出“lose”。
樣例輸入
3 3 6 9
樣例輸出
4 3 3 6 5
輸出確實很坑人。。。
1 #include <iostream>
2
3 using namespace std;
4
5 int n;
6 int a[1111];
7 int s,k,maxx;
8
9 int main()
10 {
11 cin>>n;
12 s=k=maxx=0;
13 for(int i=0;i<n;i++)
14 {
15 cin>>a[i];
16 s=s^a[i];
17 if(i<n-1)
18 k=k^a[i];
19 if(a[maxx]<a[i])
20 maxx=i;
21 }
22 if(s==0)
23 cout<<"lose"<<endl;
24 else
25 {
26 cout<<a[maxx]-k<<" "<<maxx+1<<endl;
27 a[maxx]=k;
28 for(int i=0;i<n-1;i++)
29 cout<<a[i]<<" ";
30 cout<<a[n-1];
31 }
32 return 0;
33 }
總結
以上是生活随笔為你收集整理的【博弈论】取火柴游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招商银行手机银行怎么开通?要收费吗?
- 下一篇: 大数据价值变现的10种商业模式