刷题——修补桥面

修补桥面

题目描述

一阵大风吹过,桥面上许多木板都被大风吹走了!

防止意外发生,小可立马组织小伙伴们去修补桥面。桥面由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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值