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


你可能感兴趣的:(hdu1760 A New Tetris Game 博弈,Dfs)