hdu 1760 A New Tetris Game 博弈~~搜索求sg函数

A New Tetris Game

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1176    Accepted Submission(s): 557

Problem Description

曾经,Lele和他姐姐最喜欢,玩得最久的游戏就是俄罗斯方块(Tetris)了。

渐渐得,Lele发觉,玩这个游戏只需要手快而已,几乎不用经过大脑思考。

所以,Lele想出一个新的玩法。

Lele和姐姐先拿出一块长方形的棋盘,这个棋盘有些格子是不可用的,剩下的都是可用的。Lele和姐姐拿出俄罗斯方块里的正方形方块(大小为2*2的正方形方块)轮流往棋盘里放,要注意的是,放进去的正方形方块不能叠在棋盘不可用的格子上,也不能叠在已经放了的正方形方块上。

到最后,谁不能再放正方形方块,谁就输了。

现在,假设每次Lele和姐姐都很聪明,都能按最优策略放正方形,并且每次都是Lele先放正方形,你能告诉他他是否一定能赢姐姐吗?

Input

本题目包含多组测试,请处理到文件结束。

每组测试第一行包含两个正整数N和M(0<N*M<50)分别代表棋盘的行数和列数。

接下来有N行,每行M个0或1的数字代表整个棋盘。

其中0是代表棋盘该位置可用,1是代表棋盘该位置不可用

你可以假定,每个棋盘中,0的个数不会超过40个。

Output

对于每一组测试,如果Lele有把握获胜的话,在一行里面输出"Yes",否则输出"No"。

Sample Input

4 4
0000
0000
0000
0000
4 4
0000
0010
0100
0000

Sample Output

Yes
No

挺不错的一题,结合了搜索。

我们通过sg函数的定义可知,当一个点可以走到必败点时,则这点就是必胜点。当一个点可以走到的点都是必胜点时。那该点肯定是必败点~~

代码:

#include <stdio.h>
#include <string.h>
#define MAX 55

bool map[MAX][MAX] ;
int n, m;

bool judge(int i , int j)
{
	if(i+1<n && j+1<m)
	{
		if(map[i][j] && map[i+1][j] && map[i][j+1] && map[i+1][j+1])
		{
			return true ;
		}
	}
	return false ;
}

bool DFS()
{
	for(int i = 0 ; i < n ; ++i)
	{
		for(int j = 0 ; j < m ; ++j)
		{
			if(judge(i,j))
			{
				map[i][j] = map[i+1][j] = map[i][j+1] = map[i+1][j+1] = false ;
				if(!DFS())
				{
					map[i][j] = map[i+1][j] = map[i][j+1] = map[i+1][j+1] = true ;
					return true ;
				}
				map[i][j] = map[i+1][j] = map[i][j+1] = map[i+1][j+1] = true ;
			}

		}
	}
	return false ;
}

int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		char line[100] ;
		for(int i = 0 ; i < n ; ++i)
		{
			scanf("%s",line) ;
			for(int j = 0 ; j < m ; ++j)
			{
				if(line[j] == '0')
					map[i][j] = true ;
				else
					map[i][j] = false ;
			}
		}
		if(DFS())
			puts("Yes") ;
		else
			puts("No")  ;
	}
	return 0 ;
}

与君共勉

时间: 2024-11-06 09:31:01

hdu 1760 A New Tetris Game 博弈~~搜索求sg函数的相关文章

HDU 3032 Nim or not Nim? (博弈之求SG函数)

题意:经典Nim博弈游戏变换,给你n堆石子pi,每堆有pi个石子, Alice和Bob轮流取石子,每次可以从任意一堆中拿走任意个石子,也可以将某一堆石子分成两个小堆 (每堆石子个数必须不能为0),先拿完者获胜 思路:求SG函数后找规律: SG函数定义及求法:点击打开链接 #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #in

HDU 1536 S-Nim 求SG函数

题意:给你n个数Nnum[ i ],表示每次只能取Nnum[ i ]个数. m个问题:每次给你 l 堆石子,每堆有num个石子,问先手是否会赢. Sample Input 2 2 5 3 2 5 12 3 2 4 7 4 2 3 7 12 5 1 2 3 4 5 3 2 5 12 3 2 4 7 4 2 3 7 12 0 Sample Output LWW WWL 经典Nim游戏,找出SG就可以了. 至于如何找SG,这里有详细的 点我 #include<cstdio> #include<

博弈算法 之 SG 函数的运用

SG函数简介: 如果我们把游戏中的某一个局面看作一个顶点,把局面之间的转换用边来表示,那么很多游戏都可以转 化成图游戏模型. 图游戏模型 给定有向无环图G=(V,E)和一个起始点,双方轮流行动.每个人每次可以从当前点出发沿着 一条有向边走到另外一个点.谁无法走了谁就输. 一些图游戏可以通过Sprague-Grundy函数来判定先手的胜负情况(简称SG函数). SG函数 一个图G=(V,E)的SG函数g,是定义在v上的一个非负整数函数: g(x)=min{n>=0 | n≠g(y) for <x

【转】博弈问题及SG函数(真的很经典)

博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要看“博弈论”的时候.) Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了解博弈论恐怕是最合适不过了. Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”

(转)博弈问题与SG函数

博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要看“博弈论”的时候.) Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了解博弈论恐怕是最合适不过了. Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”

博弈问题及SG函数

转载自:http://blog.csdn.net/scut_pein/article/details/39272489 博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要看“博弈论”的时候.) Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了解博弈论恐怕是最合适不过了. Nim游戏是组合游戏(Co

hdu 1524 A Chess Game 博弈之,SG函数简单题

A Chess Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1489    Accepted Submission(s): 679 Problem Description Let's design a new chess game. There are N positions to hold M chesses in th

HDU 5795 A Simple Nim 打表求SG函数的规律

A Simple Nim Problem Description Two players take turns picking candies from n heaps,the player who picks the last one will win the game.On each turn they can pick any number of candies which come from the same heap(picking no candy is not allowed).T

hdu 3032(博弈sg函数)

题意:与原来基本的尼姆博弈不同的是,可以将一堆石子分成两堆石子也算一步操作,其它的都是一样的. 分析:由于石子的堆数和每一堆石子的数量都很大,所以肯定不能用搜索去求sg函数,现在我们只能通过找规律的办法求得sg的规律. 通过打表找规律可以得到如下规律:if(x%4==0) sg[x]=x-1; if(x%4==1||x%4==2) sg[x]=x; if(x%4==3) sg[x] = x+1. 打表代码: #include<iostream> #include<cstdio> #