HDU1760 A New Tetris Game【DFS】【博弈】

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1760

题目大意:

给你一个N*M的矩阵棋盘。数字0代表该位置可用,数字1代表该位置不可以。Lele和姐姐在这个

棋盘上下棋,每次在棋盘上放一个大小为2*2的正方形,棋子间不能相互叠加。两个人轮流放,每

次都按最优策略放正方形。轮到谁没有地方放置棋子了,就算谁输。若每次都是Lele先放,那么问

题来了:Lele是否一定能赢姐姐呢。

思路:

博弈中的必胜态:当前所能到达的状态能到达一个必败态,则当前状态为必胜态。

博弈中的必败态:若当前状态到达的所有状态都是必胜态,则当前状态为必败态。

这道题和简单的取石子游戏差不多。就是DFS搜索SG值。根据题目大意可得:不能再放为必败态。

刚开始的时候,初始状态为整个棋盘,设为A。搜索位置去放置一个正方形之后的状态设为B。判断

状态B是否必败,如果必败,则状态A就是必胜态。如果状态A所有可以走到的状态B都为必胜态,那

么状态A为必败态,如果状态A无路可走也是必败态。当我们到达必胜点时,就要转换当前状态继续

递归查找SG值。递归返回0必败,返回1必胜。搜索状态B的时候,一定要注意搜索完后记得还原状态。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

char Map[55][55];

int DFS(int N,int M)
{
    for(int i = 0; i < N-1; ++i)
    {
        for(int j = 0; j < M-1; ++j)
        {
            if(Map[i][j]=='0' && Map[i+1][j]=='0' && Map[i][j+1]=='0' && Map[i+1][j+1]=='0')
            {
                Map[i][j] = Map[i+1][j] = Map[i][j+1] = Map[i+1][j+1] = '1';
                if(!DFS(N,M))
                {
                    Map[i][j] = Map[i+1][j] = Map[i][j+1] = Map[i+1][j+1] = '0';
                    return 1;
                }
                Map[i][j] = Map[i+1][j] = Map[i][j+1] = Map[i+1][j+1] = '0';
            }
        }
    }
    return 0;   //最终没有可放为必败局
}
int main()
{
    int N,M;
    while(cin >> N >> M)
    {
        for(int i = 0; i < N; ++i)
            cin >> Map[i];
        if(DFS(N,M))
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }

    return 0;
}
时间: 2024-09-07 16:21:34

HDU1760 A New Tetris Game【DFS】【博弈】的相关文章

HDU-1760 A New Tetris Game DFS

曾经,Lele和他姐姐最喜欢,玩得最久的游戏就是俄罗斯方块(Tetris)了. 渐渐得,Lele发觉,玩这个游戏只需要手快而已,几乎不用经过大脑思考. 所以,Lele想出一个新的玩法. Lele和姐姐先拿出一块长方形的棋盘,这个棋盘有些格子是不可用的,剩下的都是可用的.Lele和姐姐拿出俄罗斯方块里的正方形方块(大小为2*2的正方形方块)轮流往棋盘里放,要注意的是,放进去的正方形方块不能叠在棋盘不可用的格子上,也不能叠在已经放了的正方形方块上. 到最后,谁不能再放正方形方块,谁就输了. 现在,假

HDU1760 A New Tetris Game NP态

A New Tetris Game Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1457    Accepted Submission(s): 713 Problem Description 曾经,Lele和他姐姐最喜欢,玩得最久的游戏就是俄罗斯方块(Tetris)了.渐渐得,Lele发觉,玩这个游戏只需要手快而已,几乎不用经过大脑思

2019年FJNU低编赛 G题(dfs博弈)

###题目链接### 题目大意: 有一个 0 ~ n+1 的数轴,Alice 站在 0 点处,Bob 站在 n+1 点处.在 1 ~ n 上各有着权值. Alice 每次向右移动 1 格或两格 ,Bob 每次向左移动 1 格或 2 格(他们一定要移动),Alice 移动到 n+1 处停止,Bob 移动到 0 处停止,直到他们都停止的时候,此时若 Alice 所经过的数值总和大于 Bob 的数值总和,则 Alice 胜出,反则 Bob 胜出.Alice 先出手,两人足够聪明,走到的数值必须拿走,而

hdu 1760 DFS+博弈

0代表可放 1带表不能放 每次放一个2*2的方块 不能放者败如果先手必胜则输出Yes 必胜态:从当前状态所能到达的状态中存在一个必败态必败态:从当前状态所能达到的状态全部是必胜态 Sample Input4 400000000000000004 40000001001000000 Sample OutputYesNo 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include

HDU4101 Ali and Baba (bfs+dfs+博弈)

题意: Ali 和Baba玩游戏,游戏是在给出的一个n*m的图中,有且仅有一个宝藏(-1)表示,图中其他位置可能是空地(0表示),也可能是石头(石头的HP用一个正数表示).二人轮流,每次游戏开始都是Ali先手,选手可以攻击石头,每次可以让石头HP减少一.问Ali是否可以胜利. 开始时,直接BFS 宝藏能扩展的最大的面积,因为面对都是1包围的-1 ,这个是必败态.但是WA了:然后想了很久,想到,可能存在宝藏所形成的连通的块是个环形,把其他的石头包围在里面,这样,这些石头就等于是没用的了.所以不得不

hdu 1760

A New Tetris Game Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1130    Accepted Submission(s): 533 Problem Description 曾经,Lele和他姐姐最喜欢,玩得最久的游戏就是俄罗斯方块(Tetris)了.渐渐得,Lele发觉,玩这个游戏只需要手快而已,几乎不用经过大脑思

博弈论类题目小结——转载

出处http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 首先当然要献上一些非常好的学习资料: 基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530 经典翻硬币游戏小结:http://blog.csdn.net/acm_cxlove/article/details/7854534 经典的删边游戏小结:http://blog.csdn.net/acm

HDU 2348

DFS+博弈. 假设存在两数(x,y),且x<y.对于(x+ky,y)k>=2,只能转移向两种状态(x+y,y),或者(x,y).而对于(x+y,y)只能向(x,y)转移,那么,可知,无论(x,y)为败点还是胜点,(x+ky,y)只能为胜点.于是,DFS搜索一下,就可以知道了. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using n

HDOJ 题目1760 A New Tetris Game(DFS,博弈)

A New Tetris Game Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1212    Accepted Submission(s): 582 Problem Description 曾经,Lele和他姐姐最喜欢,玩得最久的游戏就是俄罗斯方块(Tetris)了. 渐渐得,Lele发觉,玩这个游戏只需要手快而已,几乎不用经过大