• 结对开发5_循环二维数组最大字数组


    一、思想

        我们这次的思想和一维数组的思想一样,但是考虑到是二维的,所以其算法和结对开发3的算法一样。即加长数组的列数

      加以控制条件,最后求出最大子数组的和,并输出。

    二、源代码

      

    // 结对开发5.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    # include <iostream>
    # include <string>
    # define MaxRow 20
    # define MaxCol 20
    using namespace std;
    int Arr[MaxRow][MaxCol];
    int Array[MaxRow][2*MaxCol];
    int SumArr(int x1,int y1,int x2,int y2)                    //子数组求和
    {
        int sum=0;
        for(int i=x1;i<x2;i++)
        {
            for(int j=y1;j<y2;j++)
            {
                sum+=Array[i][j];
            }
        }
        return sum;
    }
    
    void LoadFile(int Arr[][MaxCol],int & Row,int & Col)
    {
        FILE * infile = fopen("D:\input.txt","r");
        int num[100];
        int count=0;
        if(!infile)
        {
            cout<<"文件读取失败!"<<endl;
            exit(-1);
        }
        else
        {
            char str[10];
            fscanf(infile,"%[^,]%*c",str);
            Row = atof(str);
            fscanf(infile,"%[^,]%*c",str);
            Col = atof(str);
            while(!feof(infile))
            {
                fscanf(infile,"%[^,]%*c",str);
                num[count++]=atof(str);
            }
        }
        for(int i=Row-1;i>=0;i--)
        {
            for(int j=Col-1;j>=0;j--)
            {
                Arr[i][j]=num[--count];
            }
        }
        for(int i=0;i<Row;i++)
        {
            for(int j=0;j<Col;j++)
            {
                Array[i][j] = Arr[i][j];
                Array[i][j+Col] = Arr[i][j];
            }
        }
    }
    
    //测试函数
    int main()
    {
        int Row=0;
        int Col=0;
        LoadFile(Arr,Row,Col);
        for(int i=0;i<Row;i++)
        {
            for(int j=0;j<Col;j++)
            {
                cout<<Arr[i][j]<<"	";
            }
            cout<<endl;
        }
        int x1,y1;                                //代表左上角点的横纵坐标
        int x2,y2;                                //代表右上角点的横纵坐标
        int flag1,flag2,flag3,flag4;        //(flag1,flag2)标识最大子数组的左上角坐标  (flag3,flag4)标识最大子数组的右下角坐标
        flag1=flag2=flag3=flag4=0;
        int max = Array[0][0];                //max存储比较过程中的最大值
        for(x1=0;x1<Row;x1++)
        {
            for(y1=0;y1<Col;y1++)
            {
                for(x2=x1+1;x2<=Row;x2++)
                {
                    for(y2=y1+1;y2<=2*Col;y2++)
                    {
                        if((y2-y1) > Col)
                        {
                            break;
                        }
                        if(SumArr(x1,y1,x2,y2)>max)
                        {
                            max = SumArr(x1,y1,x2,y2);
                            flag1=x1;
                            flag2=y1;
                            flag3=x2;
                            flag4=y2;
                        }
                    }
                }
            }
        }
        cout<<"最大子数组为:"<<endl;
        for(int i=flag1;i<flag3;i++)
        {
            for(int j=flag2;j<flag4;j++)
            {
                cout<<Array[i][j]<<"	";
            }
            cout<<endl;
        }
        cout<<"该最大子数组的和为:"<<max<<endl;
        return 0;
    }

    三、运行结果截图

      

    四、总结

        二维循环数组的实现方式和一维的并没有很大的差别,主要的差别是在实现求出最大的字数组上,

      其他的和一位数组的实现方式一样。所以,在这次的实现中并没有遇到特别难的问题。

    五、结对照片

      

  • 相关阅读:
    chrome中打开 swf下载的问题
    爱对人比爱上人更重要
    ActiveMQ集群
    ActiveMQ相关API
    ActiveMQ持久化
    ActiveMQ处理模式
    ActiveMQ
    JMS与消息队列
    微服务设计、拆分原则
    web常用服务架构
  • 原文地址:https://www.cnblogs.com/littlechar/p/4389731.html
Copyright © 2020-2023  润新知