解題報告:HDU_6139 Galaxy at War (階梯博弈)

題目鏈接

題意:

一張n*m的表格上有一些格子有一些水晶球,兩個人輪流進行遊戲

每次選擇一個有水晶球的格子,選擇其中至少一個水晶球將它左移或者下移,不能出界

還有一些格子上有M(Meditations)或者P(pollutant sources),對應的作用爲

當你選擇的格子上有M時,若你選擇移動 t 個水晶球,那麼會將2*t 個水晶球平分到可以移動到的格子內

當t個水晶被移動到有P的格子上時,t 變成 [t/2] (向下取整)

(n,m)處一定有P,(n-1,m)處一定有M

任意含M(x,y)和含P(a,b)的格子的位置關係滿足式子的值爲奇數


無法操作的玩家輸掉比賽,給定局勢,詢問先手勝負態


思路:

先分析給出的位置關係的式子,可以發現所有含有M的格子和含有P的格子的奇偶關係不同

如果沒有M和P的設定,這個問題就是一個簡單的階梯博弈,只用考慮離終點的距離爲奇數的點

含有P的位置離終點的距離一定爲偶數,所有對答案沒有影響

含有M的位置離終點的距離一定爲奇數,它每次會將一個奇數步上的 t 變成偶數步上的2*t

一定可以選擇其中的 t 重新移動到奇數步上,所以對答案同樣沒有影響

所以答案就是所有距離終點奇數步的格子的水晶數異或值


代碼:

#include<cstdio>
using namespace std;

int n,m,T,k,x,y,w;
int main()
{
   scanf("%d",&T);
   while(T--){
      scanf("%d%d%d",&n,&m,&k);
      int ans = 0 , t = (n^m);
      while(k--){
         scanf("%d%d%d",&x,&y,&w);
         if((x^y^t)&1)ans^=w;
      }scanf("%d",&k);while(k--)scanf("%*d%*d");
      scanf("%d",&k);while(k--)scanf("%*d%*d");
      printf("%s\n",ans?"win":"lose");
   }return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章