題意:
一張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;
}