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

结队小组成员:信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;
}

四、截图

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

五、实验总结

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

六、合照

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