zoukankan      html  css  js  c++  java
  • 二维数组最大子数组算法

    小组成员: 贾川  李驭龙

    算法思想:

         先将这个二维数组的每一行每一列的最大子数组求出来存到一个一维数组内,

    然后再循环求出每个矩形块元素之和再在依次存入到这个一维数组内。最后在这

    个一位数组中找出最大子数组。

    源程序代码如下:

    #include "stdafx.h"
    #include "stdio.h"
    int m;//记录一位数组的个数
    int max;//记录最大子数组和
    
    void Max0(int a[][3])//此函数作用为把二维数组每个子数组块和找出来存入到一个一维数组里,再通过比较找到一个最大的值max
    {
        int i,j,k,m,sum,b[100];
        m=0;
         for(i=0;i<3;i++)
        {   
            
            for(j=0;j<2;j++)
            {   
                sum=a[i][j];
                for(k=j+1;k<3;k++)
                {
                   sum=sum+a[i][k];
                   b[m++]=sum;
                }
            }
        }
        for(i=0;i<3;i++)
        {   
            
            for(j=0;j<2;j++)
            {   
                sum=a[j][i];
                for(k=j+1;k<3;k++)
                {
                   sum=sum+a[k][i];
                   b[m++]=sum;
                }
            }
        }
        for(i=0;i<2;i++)
        {   
            
            for(j=0;j<2;j++)
            {   
                sum=a[i][j]+a[i+1][j];
                for(k=j+1;k<3;k++)
                {
                   sum=sum+a[i][k]+a[i+1][k];
                   b[m++]=sum;
                }
            }
        }
        for(i=0;i<2;i++)
        {   
            
            for(j=0;j<2;j++)
            {   
                sum=a[j][i]+a[j][i+1];
                for(k=j+1;k<3;k++)
                {
                   sum=sum+a[k][i]+a[k][i+1];
                   b[m++]=sum;
                }
            }
        }
        for(i=0;i<1;i++)
        {   
            
            for(j=0;j<2;j++)
            {   
                sum=a[i][j]+a[i+1][j]+a[i+2][j];
                for(k=j+1;k<3;k++)
                {
                   sum=sum+a[i][k]+a[i+1][k]+a[i+2][k];
                   b[m++]=sum;
                }
            }
        }
        for(i=0;i<1;i++)
        {   
            
            for(j=0;j<2;j++)
            {   
                sum=a[j][i]+a[j][i+1]+a[j][i+2];
                for(k=j+1;k<3;k++)
                {
                   sum=sum+a[i][k]+a[k][i+1]+a[k][i+2];
                   b[m++]=sum;
                }
            }
        }
            for(i=0;i<3;i++)
            {   
            
                 for(j=0;j<3;j++)
                {  
                   b[m++]=a[i][j];
                }
            }
        max=b[0];
        for(i=0;i<m;i++)
        {
            if(max<=b[i])
            {
                max=b[i];
            }
        }
    
        printf("最大子数组和为:%d
    ",max);
    }
        
    int main(int argc, char* argv[])
    {
        int num[3][3];
        int i,j;
        printf("请输入九个数:
    ");
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                scanf("%d",&num[i][j]);
            }
        }
        printf("生成的数组矩阵为:
    ");
            for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                printf("%d     ",num[i][j]);
                if(j==2)
                        {
                            printf("
    
    ");
                        }
            }
            
        }
        Max0(num);
        return 0;
    }


    运行结果如下







    草稿设计图如下:(可能有点乱)



    实验心得:
    这次试验主要是根据上次的一维数组求最大子数组算法的改编,也是逐个寻找,
    只是多了几个for循环内部矩阵的查找。缺点比较明显,占用资源量比较大。

    
    
  • 相关阅读:
    Java集合分析
    数据结构之红黑树
    数据结构之二叉查找树
    数据源 连接oracle
    Android使用jxl快速生成Excel表
    Java 条形码 二维码 的生成与解析
    setPreferredSize和setSize的区别及用法
    JAVA学习Swing章节布局管理器简单学习 补充(第四种布局理解)
    swing外观框架
    Java 实现ftp 文件上传、下载和删除
  • 原文地址:https://www.cnblogs.com/ID-q-han/p/3608804.html
Copyright © 2011-2022 走看看