找sg值,可以选择暴力,也可以利用sg值的特点简化。
暴力就跟取石子一样,没什么差别,DFS搞定。把矩阵看成一个字符串,字符串就是一个状态。
其实我们也可以不暴力求sg值,因为只要当前状态能到达一个sg值为0的点,当前状态就是必胜点。
若当前点到达的所有状态都是必胜的,那么当前点就是必败点。所以当我们到达必胜点时,就必须转换当前状态继续递归找sg值。
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }