标签:style blog color io os for div 问题 sp
1 3
1 1 1 3
3 1 1 3
1 3 2 1 1 3
1 1 1 3 1 2 2 1 1 3
3 1 1 3 1 1 2
2 2 1 1 3
……
一行有1个1,1个3,所以第二行为1 1 1 3,第二行有3个1和1个3,所以第三行为3 1 1 3。
#include<iostream> #include<stdio.h> #include<cstring> #include<stdlib.h> using namespace std; void creatNumbers(int *a,int num,int rows) //num为第一行的长度 { int (*b)[100] = new int[rows][100]; memset(b,0,sizeof(int)*rows*100); int length = num; //length为为一行的长度 int curRow = 0; int count; //count表示每一行中相同元素的个数 int value[100] = {0}; //存储每一行中每组相同元素的值 int cnt = 1; //每一行中的组数 int cntNum[100] = {0}; //存储每一行中的组数 for(int i=0; i<num; i++) //打印第一行 { cout<<a[i]<<" "; } cout<<endl; for(int i=0; i<num; i++) { b[curRow][i] = a[i]; } while(--rows) { count = 1; for(int i=0; i < length; i++) { if( i < length-1) { if(b[curRow][i] == b[curRow][i+1]) { count++; } else { cnt++; value[cnt-2] = b[curRow][i]; cntNum[cnt-2] = count; count = 1; //当前数字和后一个数字不同时,重置count为1 } } else { if(b[curRow][i] == b[curRow][i-1]) { cntNum[cnt-2]++; } else { cnt++; value[cnt-2] = b[curRow][i]; cntNum[cnt-2] = 1; } } } length = 2*(cnt-1); //实际组数是cnt-1,故下一组的长度是2*(cnt-1) curRow++; for(int j=0; j<cnt-1; j++) //对下一行进行赋值 { int m = 2*j; b[curRow][m] = cntNum[j]; b[curRow][m+1] = value[j]; } for(int i = 0;b[curRow][i]!=0; i++) //打印 { cout<<b[curRow][i]<<" "; } printf("\n"); cnt = 1; //重置组数 memset(value,0,sizeof(int)*100); //重置value和cntNum数组 memset(cntNum,0,sizeof(int)*100); } } int main() { int a[]= {1,3}; creatNumbers(a,2,7); return 0; }
虽然能解决这个问题,但这又很大的局限性,只能针对第一行为两个不同的数,如果第一行是一个或除二以外的其他数,都会出现错误输出~~哪个大神能修改一下呢,让它功能更强大呢
标签:style blog color io os for div 问题 sp
原文地址:http://www.cnblogs.com/ziquan/p/3971734.html