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

原文地址:https://www.cnblogs.com/xin-hua/p/3251329.html