zoukankan      html  css  js  c++  java
  • 求二维矩阵和最大的子矩阵

    结队小组成员:信1201-1班  燕亚峰 

                         信1201-1班  王童博 

    一、题目与要求

          求二维矩阵中和最大的子矩阵。

     二、设计思路

          将二维数组转化为一维数组,在运用一维数组求最大子数组方法求出。c[0][]=a[0][];c[1][]=a[0][]+a[1][];依次往下。然后将二维数组存到txt文件中。

     三、源代码

    #include<iostream.h>
    #include<fstream.h>
    void writeFile(int a[][20],int length,int row)//文件写入
    {
        ofstream outFile;
        outFile.open("test.txt",ios::app);
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<length;j++)
            {
                outFile<<a[i][j]<<"  ";
            }
            outFile<<endl;
        }
        outFile.close();
    }
    int max1(int a[],int N);
    int column(int a[][20],int length,int num1) //求最大和
    {
        int y=0;
        int d[20];
        int e[100];
        int c[100][20];
        c[0][0]=0;
        int p=0;
        int b[100]={0};
        for(int j=0;j<num1;j++)
        {
            for(int t=j;t<num1;t++)
            {
                for(int i=0;i<length;i++)
                {
                    b[i]=b[i]+a[t][i];
                    c[p][i]=b[i];
                }
                p=p+1;
            }
            for(int o=0;o<100;o++)
            {
                b[o]=0;
            }
        }
        for(int l=0;l<p;l++)
        {
    
            for(int u=0;u<length;u++)
            {
                d[u]=c[l][u];
                //cout<<d[u]<<"  ";
            }
            e[y++]=max1(d,length);
            //cout<<e[y-1]<<"  ";
        }
        int Max=e[0];
        for(int i=0;i<y;i++)
        {
            if(e[i]>=Max)
            {
                Max=e[i];
            }
        }
        return Max;
    }
    int max1(int a[],int N)    //球一维最大和
    {
    
        int b[20];    //正负交替数组
        int c[20];    //最终比较数组
        int i;
        int M;        //存放数组b的长度
        int j=0;
        int max;      //存放最大值
        int p=0;
        int sum;      //相邻正数和
        int sum1;     //相邻负数和
        sum=0;
        sum1=0;
        int u=0;
        //判断数组是否全负
        for(i=0;i<N;i++)
        {
            if(a[i]>=0)
            {
                u=1;
            }
        }
        if(u==1)
        {
            //求出相邻正数或相邻负数的和,形成正负交替数组
            for(i=0;i<N;i++)
            {
                if(a[i]>=0)
                {
                    if(i<N-1)
                    {
                        if(a[i+1]>=0)
                        {
                            sum=sum+a[i];
                        }
                        else
                        {
                            b[j++]=sum+a[i];
                            sum=0;
                        }
                    }
                    else
                    {
                        if(a[i-1]>=0)
                        {
                             b[j++]=sum+a[N-1];
                        }
                        else
                        {
                             b[j++]=a[N-1];
                        }
                    }
    
                }
                else if(a[i]<0)
                {
                    if(i<N-1)
                    {
                        if(a[i+1]<0)
                        {
                            sum1=sum1+a[i];
                        }
                        else
                        {
                            b[j++]=sum1+a[i];
                            sum1=0;
                        }
                    }
                    else
                    {
                        if(a[i-1]<0)
                        {
                            b[j++]=sum1+a[N-1];
                        }
                        else
                        {
                            b[j++]=a[N-1];
                        }
                    }
                }
            }
            M=j;
            if(b[0]<0)
            {
                j=1;
            }
            else
            {
                j=0;
            }
            //对数组B进行操作,将利用算法求的机最大值存入数组c中
            for(int y=j;y<M;y=y+2)
            {
                if(y+2<M)
                {
                    if(b[y]+b[y+1]>=0)
                    {
                        c[p++]=b[y];
                        b[y+2]=b[y+2]+b[y+1]+b[y];
                        if((y+2==M-1)||(y+2==M-2))
                        {
                            c[p++]=b[y+2];
                            break;
                        }
                    }
                    else
                    {
                        c[p++]=b[y];
                    }
                }
                else
                {
                    c[p++]=b[y];
                }
    
            }
            //对数组c求最大值
            max=c[0];
            for(i=0;i<p;i++)
            {
                if(c[i]>=max)
                {
                    max=c[i];
                }
            }
            return max;
        }
        else
        {
            max=a[0];
            for(i=0;i<N;i++)
            {
                if(a[i]>=max)
                {
                    max=a[i];
                }
            }
            return max;
        }
    }
    int main()
    {
        ofstream outFile;
        outFile.open("test.txt",ios::app);
        int a[20][20];
        int length,index;
    
        cout<<"输入行数列数:";
        cin>>index>>length;
        outFile<<"行数:"<<index<<endl;
        outFile<<"列数:"<<length<<endl;
        outFile.close();
        int y=0;
        for(int i=0;i<index;i++)
        {
            for(int j=0;j<length;j++)
            {
                cin>>a[i][j];
            }
        }
        writeFile(a,length,index);
    
        int s=column(a,length,index);
        cout<<"最大和为:"<<s<<endl;
        return 0;
    }

    四、截图

    五、实验总结

     一开始的时候我们两个想得不一样,我们分别讲了自己的思路,通过我们充分沟通,分配好了各自的任务。这次实验在文件的时候,我们找了很多资料,通过查阅资料解决了问题。我们想象不到二维数组怎么使用,我提出我们把所有的都列举出来,就想到了想到一维数组。一个人的思维总是有局限性的,只有通过沟通,思想才会更加完美。

    六、合照

  • 相关阅读:
    powershell初探(七)
    powershell初探(九)
    打造一个有感觉的Vim(一)
    屏幕录像软件Wink
    注释也精彩
    解决XP专业版局域网访问故障十八招
    可以抓文字的抓图软件
    轻松玩转XP系统(一)
    Excel实战技巧之[活用条件格式]
    局域网传输工具飞鸽传书IPMessager
  • 原文地址:https://www.cnblogs.com/yanyafeng/p/4357265.html
Copyright © 2011-2022 走看看