第四堂测试——二维数组
想了这个问题有好几遍,看似简单,但是怎么也做不出来,真的是 反思自己 ,每一次此做算法题,都想小时候做的奥数,浑身出汗,脚底,手心冒汗 ,绞尽脑汁,但是不管怎么样,都是想不出来,让我不禁想起小时候脑袋摔到地上,被二姐用铁饼砸的事情, 我现在还隐隐作痛。
那么这二维数组求和,我想出了三种方案,当然有两种是同学启发的
一:
既然二维数组,那么就是矩形,矩形的化,是不是可以这么想,例如
(1) 1 2 3
(2) 2 2 2
(3) 0 0 0
这一个二维数组,那么他的矩形可以是,每一个小块,同时也可是随机每一相邻的块的组合
那么,单单(1)是三个 (2)+(1)是不是也是3个,然后他的列集中随机组合就可以了。
这个想法试了很久,依旧没有实现。。。。
二:
在一个就是把二维数组,分成好几块。他的级别可以这样分
第一层:可以分成几块,也就是有几个组合,比如这个块是一个那么宽,或者3个那么宽,所以他的取值也就是1-n;
第二层:是几行,也就是分成很多行。
第三层:针对单个行的运算和一维数组比较像。
第四层:是进行累计相加。
这个的关键,便是第四层能够实现,针对第一层的块,来实现这一列的块数相加,!!!!!,这个是个大瓶颈,今天晚上应该就能解决掉。
三:
例如:
(1)(2)(3)
(1)2 3 2
(2)2 2 2
(3)0 -1 2
这个数组,怎么可以确定一个矩形呢,那便是得知他的左上角,右下角,就可以知道这个举行了。
a第一个for是每一行,从0到n-1
n第二个for是针对第一个,在其上进行相加到n-1 那么这个的意思也就是说,从第一个到下一个的位置矩形的长也就顶了,我们就知道,这个的长了!!!!
b第三个for是每一列 从 0到n-1;
m第四个,是从第三个到第四个这之间的,确定矩形的宽。
然后就要在这个已知区间里进行相加了。
For(int i=a;i<n;i++)
For(int j=b;j<m;j++)
{
X=x+str[i][j];
}
1 package 数组; 2 import java.util.List; 3 import java.util.Scanner; 4 import java.util.*; 5 import java.util.Scanner; 6 import java.util.StringTokenizer; 7 import java.io.BufferedReader; 8 import java.io.FileOutputStream; 9 import java.lang.Math; 10 import java.io.IOException; 11 public class ErJie { 12 13 public static void main(String[] args) 14 { 15 //定义 16 int[][] str=new int[100][100];//主体 17 int[] str1=new int [100];//每一个的串值 18 //规定长与宽 19 System.out.println("请输入长,宽:"); 20 int a=0;//总数 21 int b=0; 22 Scanner scan=new Scanner(System.in); 23 a=scan.nextInt(); 24 b=scan.nextInt(); 25 //输入值 26 System.out.println("请输入值:"); 27 for(int i=0;i<a;i++) { 28 for(int j=0;j<b;j++) 29 {int s1; 30 s1=scan.nextInt(); 31 str[i][j]=s1;} 32 }int l=0; 33 //输出 34 for(int i=0;i<a;i++) { 35 for(int j=0;j<b;j++) 36 System.out.println("("+(i+1)+", "+(j+1)+")是:"+str[i][j]); 37 } 38 //代码实现 39 int Q=0;int M=0; 40 for(int i=0;i<a;i++) {//一共一行到a行 41 Q=Q+1;//几块进行运算(2 4 。。) 42 int O=0; 43 for(int n=i;n<a;n++) {//每一行 44 O=O+1;//每一行就是对一维的下移 45 for(int j=0;j<b;j++) {//每一个 46 int P=0;//每一个小组合的第一个 47 for(int m=j;m<b;m++) {//从j加到最后 48 int a1=str[i][j]; 49 50 for(int x=i;x<=n;x++) { 51 for(int y=j;y<=m;y++) { 52 a1=str[x][y]+a1; 53 } 54 } 55 str1[M]=a1-str[i][j]; 56 M=M+1; 57 } 58 } 59 } 60 } 61 int x=str1[0]; 62 for(int i=0;i<M;i++) { 63 if(str1[i]>x)x=str1[i]; 64 } 65 66 System.out.println(x); 67 68