hdu1760 A New Tetris Game 博弈,Dfs

     N*M的棋盘,0表示可用1表示不可用,两人轮流向棋盘中放置2*2的棋子,棋子与棋子不能重叠,同样不能覆盖不可用区域,先不能放棋子的输,求先手胜负。

棋盘最大也就50*50,直接从初始状态Dfs,边界条件棋盘不能放置棋子为必败态,对于每个状态若子状态中有一个为必败态则直接返回true,所有的子状态都为true的时候则返回false。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
struct node
{
    char s[55][55];
};
int n,m;
void copy(node &a,node &b)
{
    for (int i=0; i<n; i++)
     for (int j=0; j<m; j++)
     a.s[i][j]=b.s[i][j];
}
bool empty(node p,int x,int y)
{
    if (p.s[x][y]=='0' && p.s[x+1][y]=='0' && p.s[x][y+1]=='0' && p.s[x+1][y+1]=='0') return true;
    return false;
}
bool dfs(node p)
{
    node q;
    copy(q,p);
    for (int i=0; i+1<n; i++)
     for (int j=0; j+1<m; j++)
     if (empty(p,i,j))
     {
         q.s[i][j]=q.s[i+1][j]=q.s[i][j+1]=q.s[i+1][j+1]='1';
         if (!dfs(q)) return true;
         q.s[i][j]=q.s[i+1][j]=q.s[i][j+1]=q.s[i+1][j+1]='0';
     }
    return false;
}
int main()
{
//    freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&n,&m))
    {
        node st;
        for (int i=0; i<n; i++)
        scanf("%s",st.s[i]);
        if (dfs(st)) puts("Yes");
        else puts("No");
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值