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

*/

 

你可能感兴趣的:(T)