階梯博弈(歷屆試題 高僧斗法 )


 

 我們可以將人從前往后兩兩配對,在同一對人中,如果對手移動后一個人,你總能移動前一個相同的步數,

所以一對人的后一個人與后面一對人的前一個人有多少台階是沒有影響的。

所以只要考慮同一對人之間有多少台階就行了,這樣就轉化為了Nim游戲。

如圖: a與b配對, c與d配對 ,那么b與c之間的台階是沒有影響的,無論b怎么移動,a總能夠移動相同的步數

 

如果該Nim游戲為必勝,那么我們只要移動配對人中的前一人就好了,如果對手想要破壞這種Nim游戲,即他想移動配對中的后一人,那么我們可以移動前一對的后一個人

使得依然保持Nim游戲的局勢。

如果Nim游戲必敗,那么先手者可能想破壞Nim游戲,那么后手者按照剛才的方式保持Nim游戲即可。

 1 #include <stdio.h>
 2 #include <string.h>
 3 const int N = 100 + 10;
 4 int a[N],b[N];
 5 int main()
 6 {
 7     int n = 0,i,j,k,sum = 0;
 8     while(scanf("%d",&a[n])!=EOF)
 9         n++;
10     for(i=1; i<n; ++i)
11         b[i-1] = a[i] - a[i-1] - 1;
12     for(i=0; i<n-1; i+=2)
13         sum ^= b[i];
14     if(sum==0)
15         printf("-1\n");
16     else
17     {
18         //枚舉第i個人移動j步,使得剩下的局面異或等於0,
19         for(i=0; i<n-1; ++i)
20             for(j=1; a[i]+j<a[i+1]; ++j)
21             {
22                 
23                 b[i] -= j;
24                 if(i!=0)
25                     b[i-1] += j;
26                 
27                 sum = 0;
28                 for(k=0; k<n-1; k+=2)
29                     sum ^= b[k];
30                 if(sum==0)
31                 {
32                     printf("%d %d\n",a[i],a[i]+j);
33                     break;
34                 }
35                 b[i] += j;
36                 if(i!=0)
37                     b[i-1] -= j;
38                 
39             }
40     }
41     return 0;
42 }

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM