Tju_1090
这个题花了不少时间,题目的意思是给一个二维数组,求出每一列上连续0的个数,最后从i=1--m依次输出连续的0的个数为i的个数。
这个题首先就确定了使用矩阵的转置,但是无奈编程没练好,这题应该在5分钟内过的,下面几点是我在编程时遇到的错误
1.一开始我使用的是int a[][],但是做到一半后发现每一行的数字是连在一起的,无奈重做。接下来我又不假思索的用string a[],但是当我转置的时候发现也不好,最后改用了char a[][],
2,char a[][]应该初始化
3.o(n^2)时间内找到个数,这里一开始没有考虑每一行最后一位为0的情况,唉编程不行啊。
以下是代码:
View Code
#include <iostream> #include <stdio.h> #include <memory.h> using namespace std; const int maxnum=200; char a[maxnum][maxnum]; int ct[maxnum]; int main() { int m,n; int i,j; scanf("%d%d",&m,&n); int res=(m?n:m>=n); for(i=0;i<res;i++) for(j=0;j<res;j++) //初始化 a[i][j]='0'; memset(ct,0,sizeof(ct)); for(i=0;i<m;i++) for(j=0;j<n;j++) cin>>a[i][j]; //? printf 不行吗 char ch; for(i=0;i<res;i++) for(j=0;j<i;j++) //转置 { ch=a[i][j]; a[i][j]=a[j][i]; a[j][i]=ch; } int cnt; int step; for(i=0;i<n;i++) { step=0; cnt=0; while(step<m) { if(a[i][step]=='0') { cnt++; if(step+1==m) //考虑结尾为0的情况 ct[cnt]++; step++; //不能颠倒 } else { ct[cnt]++; step++; cnt=0; } } } for(i=1;i<=m;i++) if(ct[i]!=0) printf("%d %d\n",i,ct[i]); return 0; } /* 不能用int a[][],string a[], 5 10 1110000111 1100001111 1000000011 1111101111 1110000111 */