POJ 2311

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");
	}
}


 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值