本帖最后由 iklim 于 2013-09-10 17:06:22 编辑

解决方案 »

  1.   

    public static void main(String[] args) {
    int arr[][]={
    {1,1,0,1,0,1,1,1,0,1},
    {1,0,1,0,1,0,1,0,1,0},
    {1,1,0,1,1,1,1,1,0,1},
    {1,0,0,1,0,1,1,1,0,0},
    {1,1,1,1,1,1,1,1,1,1},
    };
     int  numrow[][] = new int [5][5];
     int  numcol[][]=new int[3][10];
    /*求个算法 (arr五行十列)
     *  行:从arr[0[0]]到arr[0][9]如果值是1则累计和然后赋给numrow[0][],如果为0跳过不累计
     * 
     * 最后numrow[5][5]={
     *  {2,1,3,1,0},
     * {1,1,1,1,1},
     * {2,5,1,0,0},
     * {1,1,3,0,0},
     * {10,0,0,0,0},
     *  }
     * 
     * 
     * 列:从arr[0[0]]到arr[4][0]如果值是1则累计和然后赋给numcol[0][],如果为0跳过不累计
     * 最后numcol[3][10]={
     *  {5,1,1,1,2,1,5,1,1,1},
     * {0,1,1,3,1,3,0,3,1,1},
     *       {0,1,0,0,0,0,0,0,0,1},
     *  }
     * 
     * 
     * 遍历arr一次就把numrow numcol两个值算出来
     * **/
    }
      

  2.   


    public static void main(String[] args) {
            int arr[][]={
                    {1,1,0,1,0,1,1,1,0,1},
                    {1,0,1,0,1,0,1,0,1,0},
                    {1,1,0,1,1,1,1,1,0,1},
                    {1,0,0,1,0,1,1,1,0,0},
                    {1,1,1,1,1,1,1,1,1,1},
                    };
             int  numrow[][] = new int [5][5];
             int  numcol[][]=new int[3][10];
            
             int sum = 0;
             for(int i=0;i<5;i++){
              for(int j=0;j<10;j+=2){
              sum = 0;
              for(int k=j;k<10;k++){
              if(k!=j&&arr[i][k]==0)break;
              sum += arr[i][k];
              }
              numrow[i][j>>1] = sum;
              }
             }
             for(int j=0;j<10;j++){
              for(int i=0;i<5;i+=2){
              sum = 0;
              for(int k=i;k<5;k++){
              if(k!=i&&arr[k][j]==0)break;
              sum += arr[k][j];
              }
              numcol[i>>1][j] = sum;
              }
             }
             
             for(int i=0;i<5;i++){
              for(int j=0;j<5;j++){
              System.out.print("\t"+numrow[i][j]);
              }
              System.out.println();
             }
             for(int i=0;i<3;i++){
              for(int j=0;j<10;j++){
              System.out.print("\t"+numcol[i][j]);
              }
              System.out.println();
             }
        }
      

  3.   

    错误的代码,不想做了,解决的思路应该是这样的。
    因为只能遍历一次,所以比较麻烦。
    package cn.dzr.number;
    public class Number {
        public static void main(String[] args)
        {
            int arr[][]={
                    {1,1,0,1,0,1,1,1,0,1},
                    {0,1,0,1,0,1,1,0,1,0},
                    {1,1,0,1,1,1,1,1,0,1},
                    {1,0,0,1,0,1,1,1,0,0},
                    {1,1,1,1,1,1,1,1,1,1},
                    };
            
             int  numrow[][] = new int [5][5];
             int  numcol[][]=new int[3][10];
            
            int r = 0;      //表示行的统计数目
            int[] l = {0,0,0,0,0,0,0,0,0,0};      //表示列的统计数目
            
            int rsum = 0;   //行的初值
            
            int[] lsums = {0,0,0,0,0,0,0,0,0,0};   //列的初值
            
            
            for(int i=0;i<5;i++)
            {
                System.out.println(i+"XXXXXXXXX");
                rsum=0;
                   r=0;
                for(int j=0;j<10;j++)
                {
                    //处理行数据
                    if(arr[i][j]==1)
                    {
                        //如果当前数字为1,则需要分两种情况讨论
                        //1,rsum==0  则将rsum==1;
                        
                        //2, rsum>1; 则rsum++;
                        
                            rsum++;
                    }
                    
                    if(arr[i][j]==0)
                    {
                        //当前数字如果为0,则分两种情况讨论
                        //1, rsum==0 则不做处理,继续跳过
                        //2, rsum>0;则将rsum的值保存到numrow中。
                        if(rsum!=0)
                        {
                            numrow[i][r++]= rsum;
                            System.out.println(rsum);
                            rsum=0;
                        }
                    }
                    
    //                //处理列
                  if(i==0)
                      lsums[i]=arr[0][i];
                  
                   if(i>0)
                  {
                        if(arr[i][j]==0)
                       {
                            //如果这个时候,lsum[j]为0,则什么都不做,跳过
                            //如果前面的数为>0,则将该值保存到 numcol[l[i]][i]中。同时 l[i]++;
                            if(lsums[j]>0)
                            {
                                System.out.println("l[i]="+l[i]+" i:"+i);
                                numcol[l[i]][j]=lsums[i];
                               lsums[i]=0;
                              l[i]++;
                                
                           }
                      }
                        
                        if(arr[i][j]==1)
                        {
                            //如果lsums[j]为0,则将该值赋值给lsum[j]
                           
                            lsums[j]++;
                           
                        }
                    }
                    
                }
            }
            
            out(numrow);
            System.out.println("---------------------------------");
            out(numcol);
        }
        
        public static void out(int[][] arrs)
        {
            for(int i=0;i<arrs.length;i++)
            {
                for(int j=0;j<arrs[i].length;j++)
                {
                    System.out.print(arrs[i][j]+" ");
                }
                System.out.println();
            }
        }
    }
      

  4.   

    上面的41行下面加
                             if(j==9)
                                numrow[i][r++]=rsum;可以得到正确的解决行的统计问题。
      

  5.   

    这个应该可以了。我的时间,全部都浪费了。package cn.dzr.number;
    public class Number {
        public static void main(String[] args)
        {
            int arr[][]={
                    {1,1,0,1,0,1,1,1,0,1},
                    {0,1,0,1,0,1,1,0,1,0},
                    {1,1,0,1,1,1,1,1,0,1},
                    {1,0,0,1,0,1,1,1,0,0},
                    {1,1,1,1,1,1,1,1,1,1},
                    };
            
             int  numrow[][] = new int [5][5];
             int  numcol[][]=new int[3][10];
            
            int r = 0;      //表示行的统计数目
            int[] l = {0,0,0,0,0,0,0,0,0,0};      //表示列的统计数目
            
            int rsum = 0;   //行的初值
            
            int[] lsums = {0,0,0,0,0,0,0,0,0,0};   //列的初值
            
            
            for(int i=0;i<5;i++)
            {
               
                rsum=0;
                   r=0;
                for(int j=0;j<10;j++)
                {
                    //处理行数据
                    if(arr[i][j]==1)
                    {
                        //如果当前数字为1,则需要分两种情况讨论
                        //1,rsum==0  则将rsum==1;
                        
                        //2, rsum>1; 则rsum++;
                        
                            rsum++;
                            if(j==9)
                                numrow[i][r++]=rsum;
                    }
                    
                    if(arr[i][j]==0)
                    {
                        //当前数字如果为0,则分两种情况讨论
                        //1, rsum==0 则不做处理,继续跳过
                        //2, rsum>0;则将rsum的值保存到numrow中。
                        if(rsum!=0)
                        {
                            numrow[i][r++]= rsum;              
                            rsum=0;
                        }
                    }
                    
    //                //处理列,当处理第一行的时候,将一的行的值都赋值给lsums。
                 if(i==0)
                      lsums[j]=arr[0][j];
                  
                   if(i>0)
                  {
                        if(arr[i][j]==0)
                       {
                            //如果这个时候,lsum[j]为0,则什么都不做,跳过
                            //如果前面的数为>0,则将该值保存到 numcol[l[i]][i]中。同时 l[i]++;
                            if(lsums[j]>0)
                            {
                                
                                numcol[l[j]][j]=lsums[j];
                                System.out.println("遇到a["+i+"]["+j+"]"+"将第"+l[i]+"行第"+j+"列赋值为"+lsums[i]);
                               lsums[j]=0;
                                l[j]++;
                                
                           }
                      }
                        
                        if(arr[i][j]==1)
                        {
                            //如果lsums[j]为0,则将该值赋值给lsum[j]
                           
                            lsums[j]++;
                            if(i==4)
                            {
                                //赋值
                                numcol[l[j]][j]=lsums[j];
                            }
                           
                        }
                    }
                    
                }
            }
            
            out(numrow);
            System.out.println("---------------------------------");
            out(numcol);
        }
        
        public static void out(int[][] arrs)
        {
            for(int i=0;i<arrs.length;i++)
            {
                for(int j=0;j<arrs[i].length;j++)
                {
                    System.out.print(arrs[i][j]+" ");
                }
                System.out.println();
            }
        }
    }