现在有一个
n∗m
的棋盘,小哈试图用一些
1∗2
的卡片来铺满这个棋盘,卡片不能重叠,最终也不能有空余的格子在棋盘上。
过了一段时间,他觉得这个问题实在是naive,于是他将棋盘的一些点挖掉,这些点将不能用卡片覆盖。现在他想知道,是否
存在一个方案可以用卡片覆盖剩余的棋盘。
输入
有多组输入数据. 对每组数据:
第一行两个数
n,m
接下来
n
行是一个棋盘 "." 表示未被挖掉的部分, "o" 表示被挖掉的部分
1≤n,m≤233,
输出
如果可以覆盖输出yes
否则输出no
样例输入
3 3 ... .o. ...
样例输出
yes
#include <iostream>
#include <string>
using namespace std;
#define MAX 234
int n,m;
int temp[MAX][MAX];
int mat[MAX][MAX];
void copy(int a[MAX][MAX],int b[MAX][MAX]){
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
b[i][j]=a[i][j];
}
bool dfs(int i,int j,int matrix[MAX][MAX]){
if(i==n-1&&j==m-1){
if (matrix[i][j]==1)
return true;
return false;
}
int index=i*m+j,x=i,y=j;
if (matrix[i][j]==1)
{
index++;
x=index/m; y=index%m;
while((x<n&&y<m)&&matrix[x][y]==1){
if (x==n-1&&y==m-1) return true;
index++;
x=index/m; y=index%m;
}
}
if (x==n-1&&y==m-1&&matrix[x][y]==0)
return false;
if (y==m-1)
{
if (matrix[x+1][y]==1) return false;
else{
copy(matrix,temp);
temp[x+1][y]=1;
return dfs(x+1,0,temp);
}
}else if(x==n-1){
if (matrix[x][y+1]==1) return false;
else{
copy(matrix,temp);
temp[x][y+1]=1;
return dfs(x,y+1,temp);
}
}else{
bool a=false,b=false;
if (matrix[x][y+1]==1) a=false;
else{
copy(matrix,temp);
temp[x][y+1]=1;
a=dfs(x,y+1,temp);
}
if (a) return true;
if (matrix[x+1][y]==1) b=false;
else{
copy(matrix,temp);
temp[x+1][y]=1;
b=dfs(x,y+1,temp);
}
if (b) return true;
return false;
}
}
int main()
{
string s;
while (cin>>n>>m)
{
int sum=0;
for (int i=0;i<n;i++)
{
cin>>s;
for (int j=0;j<m;j++)
{
if (s[j]=='o') mat[i][j]=1;
else{
mat[i][j]=0;
sum++;
}
}
}
if (sum%2==1)
{
cout<<"no"<<endl;
continue;
}
if (dfs(0,0,mat))
cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}