题目传送门
(这道题和昨晚讲的那个是姊妹题,今儿一起讲了~
题目描述 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
是不是有一种似曾相识的感觉?其实就是让我们做和那题反过来的事情…
那让我们来分析一下这题需要肝 什么事:
- 解决没有告诉你行和列的矩阵输入问题
- 判断此时我应该统计0的连续个数还是1的连续个数
- 假设矩阵的第一行最后我还在统计0的个数,但其实我下一行还有继续连续的0,那我怎么继续统计?
例如:
0001000
0001000
输出:3 1 6 1 3
- 我怎么知道多少行多少列?
好的,那我们现在开始逐条分析:
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