Description
鸡腿想到了一个很高(sha)明(bi)的问题,墙可以看作一个N*M的矩阵,有一些格子是有污点的。现在鸡腿可以竖着刷一次,覆盖连续的最多C列,或者横着刷一次,覆盖连续的最多R行。现在鸡腿把墙上的情况告诉你,请你告诉鸡腿最少要刷多少次才能刷干净!
Input
第1行,输入俩正整数N,M。
第2到N+1行,每行一个长度为M的字符串,每个字符可能是’.’表示干净的,或者’X’表示这个格子有污点。
第N+2行,输入俩正整数表示R和C。
Output
输出一行一个整数,表示鸡腿最少要刷几次。
Sample Input
输入1:
1 9
XXXXXXXXX
2 3
输入2:
11 14
XXX…XXX…XXX.
.X…X…X…X
.X…X…X…X
.X…X…X…X
.X…XXX…XXX.
…
…XX…XXX…
…X…X…
…X…XXX…
…X…X…
…XXX…XXX…
1 2
Sample Output
输出1:
1
输出2:
7
Data Constraint
对于50%的数据1≤N,M≤5;
对于100%的数据1≤N,M,R,C≤15。
.
.
.
.
.
.
.
分析
暴力每一种行的状态,每一种状态中对列进行贪心,最后更新答案
.
.
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,r,c,ans=2147483647;
char ch[20][20];
bool bz1[20],bz2[20];
void dfs(int x,int sum)
{
if (x>n)
{
memset(bz2,false,sizeof(bz2));
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (bz1[i]==false&&ch[i][j]=='X') bz2[j]=true;
for (int i=1;i<=m;i++)
if (bz2[i]==true)
{
for (int j=1;j<=c;j++)
bz2[min(j+i-1,m)]=false;
sum++;
}
ans=min(ans,sum);
return;
}
if (bz1[x]==false)
{
for (int i=1;i<=r;i++)
bz1[min(i+x-1,n)]=true;
dfs(x+1,sum+1);
for (int i=1;i<=r;i++)
bz1[min(i+x-1,n)]=false;
}
dfs(x+1,sum);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
cin>>ch[i][j];
scanf("%d%d",&r,&c);
dfs(1,0);
printf("%d",ans);
return 0;
}