1. 程式人生 > >bzoj1434 [ZJOI2009]染色遊戲

bzoj1434 [ZJOI2009]染色遊戲

ret dong getc clu bzoj 搜索 全部 set des

Description

一共n × m 個硬幣,擺成n × m 的長方形。dongdong 和xixi 玩一個遊戲, 每次可以選擇一個連通塊,並把其中的硬幣全部翻轉,但是需要滿足存在一個 硬幣屬於這個連通塊並且所有其他硬幣都在它的左上方(可以正左方也可以正 上方),並且這個硬幣是從反面向上翻成正面向上。dongdong 和xixi 輪流操作。 如果某一方無法操作,那麽他(她) 就輸了。dongdong 先進行第一步操作,假 設雙方都采用最優策略。問dongdong 是否有必勝策略。

Input

第一行一個數T,表示他們一共玩T 局遊戲。接下來是T 組遊戲描述。每 組遊戲第一行兩個數n;m,接下來n 行每行m 個字符,第i 行第j 個字符如 果是“H” 表示第i 行第j 列的硬幣是正面向上,否則是反面向上。第i 行j 列 的左上方是指行不超過i 並且列不超過j 的區域。

Output

對於每局遊戲,輸出一行。如果dongdong 存在必勝策略則輸出“- -”(不含 引號) 否則輸出“= =”(不含引號)。(註意輸出的都是半角符號,即三個符號 ASCII 碼分別為45,61,95)

Sample Input

32
3
HHH
HHH
2 3
HHH
TTH
2 1
T
H

Sample Output

= =
- -
- -

HINT

對於40% 的數據,滿足1 ≤ n;m ≤ 5。
對於100% 的數據,滿足1 ≤ n;m ≤ 100,1 ≤ T ≤ 50。

正解:$SG$函數。

又是這種硬幣問題。。我開始以為每次翻轉一個矩形,然後寫了個$dp$求$SG$函數並成功爆零。。

然後寫一個搜索可以發現,如果$i=1$或$j=1$,$SG[i][j]=lb(max(i,j))$,否則$SG[i][j]=2^{i+j-2}$。

但是太大了,所以我們只記錄二進制的每一位是否為$0$就行了。

 1 #include <bits/stdc++.h>
 2 #define il inline
 3 #define RG register
 4 #define ll long long
 5 #define
lb(x) (x & -x) 6 7 using namespace std; 8 9 int cnt[205],bin[205],n,m,ans; 10 11 il int gi(){ 12 RG int x=0,q=1; RG char ch=getchar(); 13 while ((ch<0 || ch>9) && ch!=-) ch=getchar(); 14 if (ch==-) q=-1,ch=getchar(); 15 while (ch>=0 && ch<=9) x=x*10+ch-48,ch=getchar(); 16 return q*x; 17 } 18 19 il char gc(){ 20 RG char ch=getchar(); 21 while (ch!=H && ch!=T) ch=getchar(); return ch; 22 } 23 24 il void get(RG int x,RG int y){ 25 if (x==1){ cnt[bin[lb(y)]]^=1; return; } 26 if (y==1){ cnt[bin[lb(x)]]^=1; return; } 27 cnt[x+y-2]^=1; return; 28 } 29 30 il void work(){ 31 n=gi(),m=gi(),memset(cnt,0,sizeof(cnt)); 32 for (RG int i=1;i<=n;++i) 33 for (RG int j=1;j<=m;++j) 34 if (gc()==T) get(i,j); 35 for (RG int i=0;i<=200;++i) 36 if (cnt[i]){ puts("-_-"); return; } 37 puts("=_="); return; 38 } 39 40 int main(){ 41 #ifndef ONLINE_JUDGE 42 freopen("color.in","r",stdin); 43 freopen("color.out","w",stdout); 44 #endif 45 for (RG int i=2;i<=100;++i) bin[i]=bin[i>>1]+1; 46 RG int T=gi(); while (T--) work(); return 0; 47 }

bzoj1434 [ZJOI2009]染色遊戲