地址: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
漸漸得,Lele發覺,玩這個遊戲只需要手快而已,幾乎不用經過大腦思考。
所以,Lele想出一個新的玩法。
Lele和姐姐先拿出一塊長方形的棋盤,這個棋盤有些格子是不可用的,剩下的都是可用的。Lele和姐姐拿出俄羅斯方塊裏的正方形方塊(大小爲2*2的正方形方塊)輪流往棋盤裏放,要注意的是,放進去的正方形方塊不能疊在棋盤不可用的格子上,也不能疊在已經放了的正方形方塊上。
到最後,誰不能再放正方形方塊,誰就輸了。
現在,假設每次Lele和姐姐都很聰明,都能按最優策略放正方形,並且每次都是Lele先放正方形,你能告訴他他是否一定能贏姐姐嗎?
每組測試第一行包含兩個正整數N和M(0<N*M<50)分別代表棋盤的行數和列數。
接下來有N行,每行M個0或1的數字代表整個棋盤。
其中0是代表棋盤該位置可用,1是代表棋盤該位置不可用
你可以假定,每個棋盤中,0的個數不會超過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;
}