KDBC——6496详解

文章讲述了如何实现一个矩阵加密算法,该算法基于连续0和1的计数。输入是一个由0和1组成的矩阵,输出是一串数字,表示连续的0和1的序列。处理过程中,需要将多行矩阵合并成一个字符串,并按特定规则统计连续的0和1。
摘要由CSDN通过智能技术生成

题目传送门
(这道题和昨晚讲的那个是姊妹题,今儿一起讲了~
题目描述 Description
擎天柱将火种从霸天虎手里夺回来了,为了防止火种再次被敌人夺去,擎天柱给火种设置了一个密码,该密码是一个矩阵,大小为M*M,矩阵中的元素为0或者1,为了进一步增强安全性,擎天柱又将此矩阵密码进行加密,加密的规则为:首先是一个数M,然后按照平时阅读的顺序(由左至右,从上到下),遍历该矩阵中的元素,依次将连续的0或者1的个数记录下来(第一个数是连续的0的个数)。这样就将之前的矩阵变换为了一串数字,请你编写程序实现加密功能。
输入描述 Input Description
一个矩阵,元素之间没有空格
输出描述 Output Description
一行数,空格隔开,表示矩阵加密后的结果
样例输入 Sample Input
0001000
0001000
0001111
0001000
0001000
0001000
1111111
样例输出 Sample Output
7 3 1 6 1 6 4 3 1 6 1 6 1 3 7
数据范围及提示 Data Size & Hint
3<=M<=200


是不是有一种似曾相识的感觉?其实就是让我们做和那题反过来的事情…
那让我们来分析一下这题需要 什么事:

  1. 解决没有告诉你行和列的矩阵输入问题
  2. 判断此时我应该统计0的连续个数还是1的连续个数
  3. 假设矩阵的第一行最后我还在统计0的个数,但其实我下一行还有继续连续的0,那我怎么继续统计?
 例如:
 0001000
 0001000
 输出:3 1 6 1 3
  1. 我怎么知道多少行多少列?

好的,那我们现在开始逐条分析:
first:既然没有告诉我们几行几列,那我们干脆全部输入到一个东西里面去,但我们又要结合第四条,最后还得先输出这是几行几列的矩阵,那么再看样例,它是按照标准矩阵换行输入的。那么此时,眉开眼笑! 蒟蒻的脑子告诉我们:用string!!!!!

second:问题又来了,结合第三条,若我们只做了一个string的矩阵,我应该怎么统计包含换行的连续0/1的个数呢?那么此时,我们要把变成线

注意看,这个蒟蒻要开始操作了:
题目给我们的是这样的:
0001000
0001000
难搞啊~~
那我们何尝不能把他变成这样的:
00010000001000
哇!金色传说!

所以,我们只需要把输入的单个字符串连起来,变成一长溜子,不就行了?~
让我们施展魔法:

#include<bits/stdc++.h>
using namespace std;
int cnt=1,l;  //l表示这是一个l*l的矩阵,用于记录(cnt后面会用
string s,b;  //命名不是故意的......
int main(){
	while(cin>>s){//我们只需要在这里输入一节一节的字符串
        b+=s;//然后再定义一个空的把它们连接起来
        l=s.size();//记录s.size()也就是记录了这是一个s.size()列的矩阵
    }
    cout<<l<<" ";//我们先把l输出
    return 0;
}

nice啊~~~~~~
接下来我们只需要对这个b字符串进行操作就可以了:

for(int i=0;i<b.size();){//这一段连续的搞完了,那我就要跳到下一段了。所以i下标并不用在这里变化
    int t=0;//t表示这个数连续的个数
    if(cnt%2==0){//当前应该看1连续的个数了
        for(int j=i;j<b.size();j++){
            if(b[j]=='1') t++;
            else break;//直接跳掉
        }
        cnt++;//记录一下,下次改到0了
        cout<<t<<" ";
        i+=t;//这里要将i下标更改了,要跳到接下来一段了
    }
    else{//当前应该看0连续的个数了
        for(int j=i;j<b.size();j++){
            if(b[j]=='0') t++;
            else break;//直接跳掉
        }
        cnt++;//记录一下,下次改到1了
        cout<<t<<" ";
        i+=t;//这里要将i下标更改了,要跳到接下来一段了
    }
}

是不是肥肠清晰!~
豁然开朗!~
最后总结一下做题要注意什么!
遇到题首先要分析题目要你干什么,然后逐条去解决
在逐条解决的过程中要注意有没有和当前有联系的需要同步处理的
说一下这道题吧:
好(xie)题!


yc:kimi_a

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值