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
*/

 

posted @ 2012-07-10 22:31  pushing my way  阅读(163)  评论(0编辑  收藏  举报