SG应用的场景
游戏有两个人参与,二者轮流做出决策。且这两个人的决策都对自己最有利。
当有一人无法做出决策时游戏结束,无法做出决策的人输。无论二者如何做出决策,游戏可以在有限步内结束。
游戏中的同一个状态不可能多次抵达。且游戏不会有平局出现。
任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关。
这个题目乍看一眼不满足第二条。因为当一个人剪出一个格子的形状时就结束了,但是此时并不是另一个人无法做出决策。故需要将题目转化一下,规定终止状态为2*2,2*3,3*2这三种,如果一个人达到这个状态,就输了。
可令sg[2][2]=sg[2][3]=sg[3][2]=0;往上递推就行。
#include<stdio.h>
#include<string.h>
int n,m;
int sg[210][210];
int calsg(int x,int y){
int i;
bool next[250];
memset(next,0,sizeof(next));
if(sg[x][y]!=-1)
return sg[x][y];
for(i=2;i<=x-i;i++)
next[calsg(i,y)^calsg(x-i,y)]=1;
for(i=2;i<=y-i;i++)
next[calsg(x,i)^calsg(x,y-i)]=1;
for(i=0;;i++)
if(next[i]==0){
sg[x][y]=i;
return i;
}
}
int main(){
int i,j;
memset(sg,-1,sizeof(sg));
sg[2][2]=sg[2][3]=sg[3][2]=0;
while(scanf("%d %d",&n,&m)==2){
if(calsg(n,m)==0)
printf("LOSE\n");
else
printf("WIN\n");
}
}