【题目翻译】
让你用1*1和1*2的砖块铺满空白的格子。1*2的砖块只能横着放。
用11的砖块代价是x,12的代价则是y.
问你需要的最小代价。
【题解】
看到1*2只能横着放。问题就简单多了。若x2<=y则直接放11的就行了。
否则1*2可以放久放这个。(单位格子价格更低);
【代码】
/*
显然有的性质:
如果x*2<=y
那肯定直接用1*1的了。
如果x*2>y
像这种情况,怎么知道要竖着放还是横着放?
...
.
*/
#include<bits/stdc++.h>
#define ll long long
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
using namespace std;
const int N = 1000;
int T,n,m,x,y;
char s[N+10][N+10];
int main(){
//cout<<(1LL<<62)<<endl;
#ifdef LOCAL_DEFINE
freopen("D:\rush.txt","r",stdin);
#endif
rei(T);
while (T--){
rei(n);rei(m);rei(x);rei(y);
rep1(i,1,n){
scanf("%s",s[i]+1);
}
int tot = 0;
rep1(i,1,n){
rep1(j,1,m){
if (s[i][j]=='.'){
if (x*2<=y){
s[i][j]='*';
tot+=x;
}else{
if (j+1<=m && s[i][j+1]=='.'){
s[i][j]='*';
s[i][j+1]='*';
tot+=y;
}else{
s[i][j]='*';
tot+=x;
}
}
}
}
}
printf("%d
",tot);
}
return 0;
}