第四堂测试——二维数组

       想了这个问题有好几遍,看似简单,但是怎么也做不出来,真的是 反思自己 ,每一次此做算法题,都想小时候做的奥数,浑身出汗,脚底,手心冒汗 ,绞尽脑汁,但是不管怎么样,都是想不出来,让我不禁想起小时候脑袋摔到地上,被二姐用铁饼砸的事情, 我现在还隐隐作痛。

       那么这二维数组求和,我想出了三种方案,当然有两种是同学启发的

一:

       既然二维数组,那么就是矩形,矩形的化,是不是可以这么想,例如

       (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
原文地址:https://www.cnblogs.com/smartisn/p/10584400.html