修补桥面
题目描述
一阵大风吹过,桥面上许多木板都被大风吹走了!
防止意外发生,小可立马组织小伙伴们去修补桥面。桥面由n×m个方格组成。有的方格损坏了需要更换木板,有的方格完好无损无需更换。
现在小可去采购所需的木板。商店中有两种规格的木板,第一种是1×1的木板,第二种是1×2的木板。第二种木板不可分割,不可旋转。第一种木板的价格为x元,第二种木板的价格为y元。请问修补完桥面最少花多少钱?
修补桥面时,完整的方格不能被修补,损坏的方格必须要被修补。
输入描述
第一行一个正整数t(1≤t≤10),代表有t组输入。
对于每组输入,第一行四个正整数n,m,x,y(1≤n≤100,1≤m≤1000,1≤x,y≤1000),代表桥面的大小以及两种木板的价格。
接下来是一个n×m的字符矩阵, . 代表是损坏的方格,∗代表完好的方格。
输出描述
如题,对于每组输入,输出最少花多少钱。
样例输入
4
1 1 10 1
.
1 2 10 1
..
2 1 10 1
.
.
3 3 3 7
..*
*..
.*.
样例输出
10
1
20
18
代码
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int n,m,x,y,t;
int q;
char c[105][1005];
int main(){
cin>>t;
while(t--){
q=0;
cin>>n>>m>>x>>y;
for(int i=1;i<=n;i++){
c[i][m]='*';
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[i][j];
}
}
if(m==1){
for(int i=1;i<=n;i++){
if(c[i][1]=='.'){
q+=x;
}
}
cout<<q<<"\n";
continue;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(c[i][j]=='.'&&c[i][j+1]=='.'){
if(2*x<y){
q+=x+x;
}
else{
q+=y;
}
c[i][j]='*';
c[i][j+1]='*';
}
else if(c[i][j]=='.'){
q+=x;
c[i][j]='*';
}
}
}
cout<<q<<"\n";
}
return 0;
}