题目描述
墙可以看作一个 N×M 的矩阵,有一些格子是有污点的。现在可以竖着刷一次,覆盖连续的最多C列,或者横着刷一次,覆盖连续的最多 R 行。已知墙上的情况告诉你,求出最少要刷多少次才能刷干净!
题目解析
用DFS先枚举每一行涂和不涂的状态,对于没有涂的行中,用竖着涂的方式补满,求出有哪几列用了竖的方式涂了,然后求出次数,求出最小值即可。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,r,c,ans=1e9;
bool line[105];
char a[105][105];
int fun()
{
int t=0;
for(int i=1;i<=m;i++)
if(line[i])
{
t++;
i+=c-1;
}
return t;
}
void dfs(int lev,int t,int s)
{
if(lev>n)
{
int k=s+fun();
if(k<ans)
ans=min(ans,k);
return;
}
if(t==0) dfs(lev+1,r-1,s+1);
else if(t>0) dfs(lev+1,t-1,s);
bool vis[105];memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++)
if(a[lev][i]=='X'&&!line[i])
line[i]=vis[i]=1;
dfs(lev+1,0,s);
for(int i=1;i<=m;i++)
if(vis[i])
line[i]=0;
return;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
cin>>r>>c;
dfs(1,0,0);
cout<<ans;
}