小型网站建设方案,河南省建设执业资格注册中心网站,wordpress支持国内视频的编辑器,网站文章做百度排名题目描述
设某汉字由 N N N \times N NN 的 0 \texttt 0 0 和 1 \texttt 1 1 的点阵图案组成。
我们依照以下规则生成压缩码。连续一组数值#xff1a;从汉字点阵图案的第一行第一个符号开始计算#xff0c;按书写顺序从左到右#xff0c;由上至下。第一个数表示连续有…题目描述
设某汉字由 N × N N \times N N×N 的 0 \texttt 0 0 和 1 \texttt 1 1 的点阵图案组成。
我们依照以下规则生成压缩码。连续一组数值从汉字点阵图案的第一行第一个符号开始计算按书写顺序从左到右由上至下。第一个数表示连续有几个 0 \texttt 0 0第二个数表示接下来连续有几个 1 \texttt 1 1第三个数再接下来连续有几个 0 \texttt 0 0第四个数接着连续几个 1 \texttt 1 1以此类推……
例如: 以下汉字点阵图案
0001000
0001000
0001111
0001000
0001000
0001000
1111111对应的压缩码是 7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 \texttt {7 3 1 6 1 6 4 3 1 6 1 6 1 3 7} 7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 第一个数是 N N N ,其余各位表示交替表示0和1 的个数压缩码保证 N × N N \times N N×N 交替的各位数之和
输入格式
汉字点阵图点阵符号之间不留空格。
输出格式
输出一行压缩码。
1.题目分析
考虑用字符串一行一行输入是比较方便的。 然后就是判断输出零和一的个数。 题意大概是输入一个由零一组成的点阵第一位数打印点阵的阶数 后面依次统计连续零和一的交替个数。 值得一提的是题目要求的第一次必须是零的连续个数所以需要在第一次非零输入时做一个特判。
2.题目思路
由于给的输入案例是按行输入的所以定义一个临时字符串读每一行 在循环中再定义一个足够大的数组将所有元素存在一个一维数组里。 值得一提的是循环跳出的条件是当行数等于列数即临时字符串的数组长度。
打印行数或者列数即是阶数。
遍历装有所有元素的数组设计一个标志变量flag 判断第一个数如果是0flag为0反之flag为1 如若是第一轮循环还需要打印零满足题目要求。 统计数加一 如果下一个元素是1且flag为0则交替flag打印sum即0的个数并重置为0。 如果下一个元素是零且flag为1则交替flag打印sum即1的个数并重置为0。 值得注意的是需要对最后一组数据的个数进行特判利用字符串的结束符\0’进行判断。
3.代码演示
#include stdio.h
#include string.hint main() {char arr[200] {0};char res[100000] {0};int count 0;int index 0;while (true) {//读到每一行字符scanf(%s, arr);for (int i 0; i strlen(arr); i) {//将所有字符存到一个数组里res[index] arr[i];index;}count;//当行数等于列数跳出循环if (count strlen(arr)) {break;}}//打印阶数printf(%d , count);int sum 0;int flag 0;for (int i 0; i strlen(res); i) {//判断第一个数标记if (res[i] 0) {flag 0;} else {//特判题目要求第一次输入必须表示几个零所以非零情况需要打印一次零if (i 0) {printf(0 );}flag 1;}sum;//如果下一个元素是1且flag为0则交替flag打印sum即0的个数并重置为0if (res[i 1] 1 flag 0) {flag 1;printf(%d , sum);sum 0;}//如果下一个元素是零且flag为1则交替flag打印sum即1的个数并重置为0if (res[i 1] 0 flag 1) {flag 0;printf(%d , sum);sum 0;}//打印最后一组数据的个数if (res[i 1] \0) {printf(%d, sum);}}return 0;
}