一、设计思想
我们的设计思路两步走,先实现重文本框里读取数组,然后再实现求最大子数组的和。
实现求最大数组的和时,我们的想法是任选二维数组两点,求该两点之间的二维数组的和,将所有可能遍历,求出最大子数组,并求出和。
二、实验代码
package com.minirisoft; import java.util.*; import java.io.*; public class MaxTwoArray { public static void ShowArr(int arr[][],int line1,int line2,int row1,int row2) { for(int i=line1;i<=row1;i++) { for(int j=line2;j<=row2;j++) { System.out.print(+arr[i][j]+" "); } System.out.println(); } } public static int GetSum(int arr[][],int n,int m,int k,int l) { int sum=0; for(int f=n;f<=k;f++) { for(int h=m;h<=l;h++) { sum+=arr[f][h]; } } return sum; } public static void main(String[] args) throws NumberFormatException, IOException { int y=0; int x=0; String line;//一行数据 int row1=0; File file=new File("f:\\input.txt");//存放数组数据的文件 BufferedReader in=new BufferedReader(new FileReader(file)); int[][] arr1 = new int[5][20];//读取出的数组 int[][] arr = new int[5][20];//读取出的数组 while((line=in.readLine())!=null) { String[]temp=line.split(","); for(int i=0;i<temp.length;i++) { arr1[row1][i]=(int) Double.parseDouble(temp[i]); } row1++; } in.close(); x=arr1[0][0]; y=arr1[1][0]; for(int i=0;i<x;i++) { for(int j=0;j<y;j++) { arr[i][j] = arr1[i+2][j]; } } System.out.println("文本里的数组为"); for(int i=0;i<x ;i++ ) { for(int j=0;j<arr.length-1 ;j++ ) { System.out.print(arr[i][j]+" "); } System.out.println(); } int sum=0; int n; int m; int k; int l; Scanner sc=new Scanner(System.in); int line1=0; int line2=0; int row2=0; int row3=0; int max=arr[0][0]; for(n=0;n<x;n++) { for(m=0;m<y;m++) { for(k=n;k<x;k++) { for(l=m;l<y;l++) { sum=GetSum(arr,n,m,k,l); if(sum>max) { max=sum; line1=n; //保存第一个数的行 line2=k; //保存第二个数的行 row2=m; //保存第一个数的列 row3=l; //保存第二个数的列 } } } } } System.out.println("最大子数组的为:"); ShowArr(arr,line1,row2,line2,row3); System.out.println("最大子数组的和为:"+max); } }
三、实验截图
四、心得体会。
这次合作充分体现了团队合作的伟大。因为做实验可以说处处碰壁,我们两个相互合作,探索,解决了所有问题。
首先在读入文本中二维数组时遇到很多问题,比如如何跳过逗号,读出说有数,如何读数时跳入下一行,如何读出数而不是字符。等等一系列的问题。
在求最大子数组时,用了算法,比如用实现一维数组时的那个算法等都不能实现,等等
但最后,终于经过我俩努力做出来了
五、小组成员:郭健豪,杨广鑫