二维数组
合作人:冯硕,宫春岩
由于本人技术有限,没有真正完成二维数组对大联通字数数组的求和,根据我自己估计,只完成了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();
}
}
截图:

左边是数,右边是所属子数组的编号。
现在就缺少一个算法,来讲所有的子数组连同到一块。

浙公网安备 33010602011771号