hdu1760(博弈暴搜)

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

A New Tetris Game

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 982    Accepted Submission(s): 456


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
 

思路:直接暴搜,因爲最多隻有40個可以放東西的方格。

代碼:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL __int64
int m,n;
int dfs(bool ma[][55])
{
    for(int i=1;i<n;i++)
    for(int j=1;j<m;j++)
    {
        if(!ma[i][j]&&!ma[i+1][j]&&!ma[i][j+1]&&!ma[i+1][j+1])
        {
            ma[i][j]=ma[i+1][j]=ma[i][j+1]=ma[i+1][j+1]=1;
            if(!dfs(ma)) {ma[i][j]=ma[i+1][j]=ma[i][j+1]=ma[i+1][j+1]=0;return 1;}
            ma[i][j]=ma[i+1][j]=ma[i][j+1]=ma[i+1][j+1]=0;
        }
    }
    return 0;
}
int main()
{
    bool map1[55][55];
    while(scanf("%d%d",&n,&m)>0)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%1d",&map1[i][j]);  //%1d,學到了
        puts(dfs(map1)?"Yes":"No");
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章