题目描述
在n×m的棋盘上,摆入T型,T型可以旋转,具体包括如下四个样式(“#”代表被T型占据的格子,“.”代表自由的格子):
### ..# .#. #..
.#. ### .#. ###
.#. ..# ### #..
`
问最多能在 n×m的棋盘上摆入多少个不重叠的T型。
输入格式
两个数n,m。(1<=n,m<=9)
输出格式
一个数,最多能放入多少个T型
输入输出样例
输入 #1复制
5 6
输出 #1复制
4
说明/提示
样例说明:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[15][15],d[15][15],ans;
void dfs(int x,int y,int s)
{
if(x==n)//边界条件
{
ans=max(ans,s);
return;
}
if(!a[x-1][y-1]&&!a[x-1][y]&&!a[x-1][y+1]&&!a[x+1][y]&&!a[x][y])
{
a[x-1][y-1]=a[x-1][y]=a[x-1][y+1]=a[x+1][y]=a[x][y]=1;
if(s+1>=d[x][y])
{
d[x][y]=max(d[x][y],s);
if(y==m-1) dfs(x+1,2,s+1);
else dfs(x,y+1,s+1);
}
a[x-1][y-1]=a[x-1][y]=a[x-1][y+1]=a[x+1][y]=a[x][y]=0;
}
if(!a[x+1][y-1]&&!a[x+1][y]&&!a[x+1][y+1]&&!a[x-1][y]&&!a[x][y])
{
a[x+1][y-1]=a[x+1][y]=a[x+1][y+1]=a[x-1][y]=a[x][y]=1;
if(s+1>=d[x][y])
{
d[x][y]=max(d[x][y],s);
if(y==m-1) dfs(x+1,2,s+1);
else dfs(x,y+1,s+1);
}
a[x+1][y-1]=a[x+1][y]=a[x+1][y+1]=a[x-1][y]=a[x][y]=0;
}
if(!a[x-1][y-1]&&!a[x][y-1]&&!a[x][y+1]&&!a[x+1][y-1]&&!a[x][y])
{
a[x-1][y-1]=a[x][y-1]=a[x][y+1]=a[x+1][y-1]=a[x][y]=1;
if(s+1>=d[x][y])
{
d[x][y]=max(d[x][y],s);
if(y==m-1) dfs(x+1,2,s+1);
else dfs(x,y+1,s+1);
}
a[x-1][y-1]=a[x][y-1]=a[x][y+1]=a[x+1][y-1]=a[x][y]=0;
}
if(!a[x-1][y+1]&&!a[x][y-1]&&!a[x][y+1]&&!a[x+1][y+1]&&!a[x][y])
{
a[x-1][y+1]=a[x][y-1]=a[x][y+1]=a[x+1][y+1]=a[x][y]=1;
if(s+1>=d[x][y])
{
if(y==m-1) dfs(x+1,2,s+1);
else dfs(x,y+1,s+1);
d[x][y]=max(d[x][y],s);
}
a[x-1][y+1]=a[x][y-1]=a[x][y+1]=a[x+1][y+1]=a[x][y]=0;
}//四种骨牌
if(y==m-1) dfs(x+1,2,s);
else dfs(x,y+1,s);
}
int main()
{
cin>>n>>m;
if(n<3||m<3)
{
cout<<0;
return 0;
}
dfs(2,2,0);
cout<<ans;
return 0;
}