hdu 4678 Mine 博弈论

这是一题简单的博弈论!!

所有的空白+边界的数字(个数为n)为一堆,容易推出其SG函数值为n%2+1;

其他所有的数字(个数为m)的SG值为m%2。

再就是用dfs将空白部分搜一下即可!(注意细节)

代码如下:

 #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define MAX 1005
#pragma comment(linker,"/STACK:1024000000,1024000000")
using namespace std;
int vis[MAX][MAX],m,n,k,tot,cnt,ans,num;
int d[][]={{-,-},{-,},{-,},{,-},{,},{,-},{,},{,}};
int cal(int i,int j)
{
int ans=;
if(i->=){
ans+=(vis[i-][j]==-);
if(j->=) ans+=(vis[i-][j-]==-);
if(j+<m) ans+=(vis[i-][j+]==-);
}
if(j->=){
ans+=(vis[i][j-]==-);
if(i+<n) ans+=(vis[i+][j-]==-);
}
if(j+<m){
ans+=(vis[i][j+]==-);
if(i+<n) ans+=(vis[i+][j+]==-);
}
if(i+<n) ans+=(vis[i+][j]==-);
return ans;
}
void dfs(int a,int b)
{
int t,u,v;
if(vis[a][b]==-) return;
if(vis[a][b]>=){
vis[a][b]=-;
num++;tot++;
return;
}
if(vis[a][b]==-){
t=cal(a,b);
tot++;
vis[a][b]=-;
if(t==){
for(int i=;i<;i++){
u=a+d[i][];
v=b+d[i][];
if(u>=&&u<n&&v>=&&v<m)
dfs(u,v);
}
}
else{
num++;
return ;
}
}
else return ;
}
void solve()
{
int i,j,k,u,v;
tot=;cnt=;ans=;
for(i=;i<n;i++){
for(j=;j<m;j++){
if(vis[i][j]==-){
int t=cal(i,j);
if(t>) vis[i][j]=t;
else{
tot++;cnt++;
num=;
vis[i][j]=-;
for(k=;k<;k++){
u=i+d[k][];
v=j+d[k][];
if(u>=&&u<n&&v>=&&v<m)
dfs(u,v);
}
ans^=(num%+);
}
}
}
}
return ;
}
int main(){
int t,i,j,u,v,w=;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&k);
for(i=;i<n;i++)
for(j=;j<m;j++)
vis[i][j]=-;
for(i=;i<k;i++){
scanf("%d%d",&u,&v);
vis[u][v]=-;
}
solve();
int ans1=(n*m-k-tot)%;
printf("Case #%d: ",++w);
if(ans1^ans) puts("Xiemao");
else puts("Fanglaoshi");
}
return ;
}
上一篇:SQL学习之分组数据Group by


下一篇:jackson-databind架包中的ObjectMapper