2020icpc上海站(正式赛) 部分题解

目录

 

B. Mine Sweeper II

大致题意:

思路:

代码:

D. Walker

大致题意:

思路:

注意:

第一种:

第二种:

第三种:

代码:

I. Sky Garden

大致题意:

思路:

代码:

G. Fibonacci(正宗签到题)

大致题意:

思路:

代码:

M. Gitignore

大致题意:

思路:

代码:

C:Sum of log   https://blog.csdn.net/m0_50623076/article/details/111565108


B. Mine Sweeper II

大致题意:

给你一个n×m的矩阵,X代表雷,.代表没有雷。扫雷的游戏。为X的点权值为0,为.的点权值为相邻八个的是雷(X)的数目(当然,如果如果在该矩阵边缘的话不是八个)。

现在给你两个图A和图B,求得再不超过nm/2次数修改B(.->X 或则X->.)使得sum与A得相同。

思路:

求B得sum和A的相同,如果只是这样记录,bfs等等进行求解的话,很难做到。因为你修改一个影响到了八个,并且不仅仅是X->. 还有.->X。既然可以修改近一半的点,是不是可以考虑下直接让B为A的方法?(样例不是这样,引导你不这样想,巨坑!)。如果字符不同的个数小于等于nm/2的话就可以。X和.是相互作用的(啥意思呢?就是说如果.得1证明周围有X,那么这个X周围也有一个.)。换句话说,如果一个图的X全部变成了.,而.全部变成X,这样的话sum不变。如果B变到A需要大于nm/2的话,变到A经过上述转换的就小于nm/2了(因为之前对A变的对经过转化后的A不再变化)。

 

代码:

#include<algorithm>

#include<iostream>



using namespace std;

const int maxn = 1e3+50;

char a[maxn][maxn] ,b[maxn][maxn];

int main(){

    int n,m;

    cin >> n >> m;

    for(int i = 0;i < n;i++)  scanf("%s",a+i);

    for(int i = 0;i < n;i++)  scanf("%s",b+i);

    int cnt = 0;

    for(int i = 0;i < n;i++)

       for(int j = 0;j < m;j++)

           if(a[i][j] != b[i][j])   cnt++;

    if(cnt > n*m/2){

       for(int i = 0;i < n;i++)

           for(int j = 0;j < m;j++)

              if(a[i][j] == 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值