hdu 1760 A New Tetris Game 博弈论

找sg值,可以选择暴力,也可以利用sg值的特点简化。

暴力就跟取石子一样,没什么差别,DFS搞定。把矩阵看成一个字符串,字符串就是一个状态。
其实我们也可以不暴力求sg值,因为只要当前状态能到达一个sg值为0的点,当前状态就是必胜点。
若当前点到达的所有状态都是必胜的,那么当前点就是必败点。所以当我们到达必胜点时,就必须转换当前状态继续递归找sg值。
代码如下:
 1 #include<iostream>

 2 #include<stdio.h>

 3 #include<algorithm>

 4 #include<iomanip>

 5 #include<cmath>

 6 #include<cstring>

 7 #include<vector>

 8 #define ll __int64

 9 #define pi acos(-1.0)

10 #define MAX 50000

11 using namespace std;

12 char str[40][40];

13 int n,m;

14 void change(int i,int j,char c)

15 {

16     str[i][j]=str[i][j+1]=str[i+1][j]=str[i+1][j+1]=c;

17 }

18 bool solve()

19 {

20     int i,j,flag=0;

21     for(i=0;i<n-1;i++)

22     for(j=0;j<m-1;j++){

23         if(str[i][j]=='0'&&str[i][j+1]=='0'&&str[i+1][j]=='0'&&str[i+1][j+1]=='0'){

24             change(i,j,'1');

25             flag++;

26             if(!solve()){

27                 change(i,j,'0');

28                 return 1;

29             }

30             change(i,j,'0');

31         }

32     }

33     if(flag<=1) return flag;

34     return 0;

35 }

36 int main(){

37     while(cin>>n>>m){

38         for(int i=0;i<n;i++) cin>>str[i];

39         if(solve()) cout<<"Yes"<<endl;

40         else cout<<"No"<<endl;

41     }

42     return 0;

43 }
View Code

 

你可能感兴趣的:(game)