解析:
基本的贪心思路是先把能消灭一整行的次数用完,使得剩下的列尽量少,然后看看看剩下的列有多少个,和b比较一下大小。
n的范围很小,我们枚举2n种状态,看可以消掉a行,剩下来的判断是否满足消掉b列
#include<bits/stdc++.h>
using namespace std;
const int N=100,M=100005;
char s[N][M];
int t,n,m,a,b;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d %d %d %d",&n,&m,&a,&b);
for(int i=0;i<n;i++) cin>>s[i];
int f=0;
for(int i=0;i<(1<<n);i++)
{
int cnt=0;
//枚举行消除
for(int j=0;j<n;j++) if((i>>j)&1) cnt++;
if(cnt!=a) continue;
int x=0;
for(int j=0;j<m;j++)
{
bool f1=0;
for(int k=0;k<n;k++)
{
//!((i>>k)&1) 是不用行消除,要用列消除
if(!((i>>k)&1)&&s[k][j]=='*') {f1=1;break;}
}
if(f1==1) x++;
}
if(x<=b) {f=1;break;}
}
if(f==1) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
}