二维数组
合作人:冯硕,宫春岩
由于本人技术有限,没有真正完成二维数组对大联通字数数组的求和,根据我自己估计,只完成了70%,下面说一下自己的思路。
思路:
遍历整个二维数组中所有正数作出标记,然后将每一个数据进行上下所有的搜索,乳沟他的周围有正数,则标记所有联通的小数组(已完成)。
最终会出现一个或多个小的联通数组,最后再将所有的联通数组用最大的负数联合成一个最大联通子数组(未完成)。再看一看单独的正数加到这个联通子数组的损失程度。
考虑加不加上。、
import java.util.Scanner; public class erwei { static int a;static int b; static int [][][]zu; static int zong; static int k=2; static int bian = 0; static Scanner in=new Scanner(System.in); public static void set() { a=in.nextInt(); b=in.nextInt(); zu=new int [a][b][2]; zong=a*b; } public static void fuzhi()//将二维数组的值输入 { int i,j; for(i=0;i<a;i++) for(j=0;j<b;j++) zu[i][j][0]=in.nextInt(); } public static void biaoji()//将数组中的所有正数标记 { int i,j; for(i=0;i<a;i++) for(j=0;j<b;j++) { if(zu[i][j][0]>=0) { zu[i][j][1]=1;//证明是正数的标记; } else { zu[i][j][1]=-1;//证明是负数的标记 } } for(i=0;i<a;i++) for(j=0;j<b;j++) if(zu[i][j][1]>=1) { if(j-1>=0)//判断某行 左边是否为正数 if(zu[i][j-1][1]>=1) { if(zu[i][j][1]>=2) { System.out.println("这是第"+k+"步"); System.out.print(zu[i][j][0]); System.out.println(zu[i][j-1][0]); zu[i][j-1][1]=zu[i][j][1]; } else { zu[i][j-1][1]=zu[i][j][1]=k; System.out.println("行左"); System.out.print(zu[i][j][0]); System.out.println(zu[i][j-1][0]); k++; } } if(j+1<a)//判断某行 右边是否为正数 if(zu[i][j+1][1]>=1) { if(zu[i][j][1]>=2) { System.out.println("这是第"+k+"步"); System.out.print(zu[i][j][0]); System.out.println(zu[i][j+1][0]); zu[i][j+1][1]=zu[i][j][1]; } else{ zu[i][j+1][1]=zu[i][j][1]=k; System.out.println("行右"); System.out.print(zu[i][j][0]); System.out.println(zu[i][j+1][0]); k++; } } if(i+1<a)// 判断某列 下边是否为正数 if(zu[i+1][j][1]>=1) { if(zu[i][j][1]>=2) { zu[i+1][j][1]=zu[i][j][1]; System.out.println("这是第"+k+"步"); System.out.print(zu[i][j][0]); System.out.println(zu[i+1][j][0]); } else{ zu[i+1][j][1]=zu[i][j][1]=k; System.out.println("列下"); System.out.print(zu[i][j][0]); System.out.println(zu[i+1][j][0]); k++; } } if(i-1>=0)//判断某列 上边是否为正数 if(zu[i-1][j][1]>=1) { if(zu[i][j][1]>=2) { zu[i-1][j][1]=zu[i][j][1]; System.out.println("这是第"+k+"步"); System.out.print(zu[i][j][0]); System.out.println(zu[i-1][j][0]); } else {zu[i-1][j][1]=zu[i][j][1]=k; System.out.println("列上"); System.out.print(zu[i][j][0]); System.out.println(zu[i-1][j][0]); k++; } } } } public static void shuchu() { int i,j; for(i=0;i<a;i++) for(j=0;j<b;j++) { if(zu[i][j][1]>=1) System.out.println(zu[i][j][0]+" "+zu[i][j][1]); } } public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("请输入行数和列数"); set(); System.out.println("请输入数组"); fuzhi(); biaoji(); shuchu(); } }
截图:
左边是数,右边是所属子数组的编号。
现在就缺少一个算法,来讲所有的子数组连同到一块。