二维数组

合作人:冯硕,宫春岩

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

}
复制代码

截图:

 左边是数,右边是所属子数组的编号。

现在就缺少一个算法,来讲所有的子数组连同到一块。

原文地址:https://www.cnblogs.com/gong123/p/6679129.html