• 二维数组


    合作人:冯硕,宫春岩

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

    截图:

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

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

  • 相关阅读:
    TCP Socket 粘包
    Toast连续弹出的问题
    SDK Build Tools revision (19.0.3) is too low for project Minimum required is 19.1.0
    数据结构精要------直接选择和堆排序算法
    hdoj 2199 Can you solve this equation? 【二分枚举】
    云端数据遭觊觎 安全问题不容忽视
    leetcode || 58、Length of Last Word
    【安全加密技术】非对称加密
    无处不在的微创新——验证码的故事
    IDLE经常使用快捷键汇总
  • 原文地址:https://www.cnblogs.com/gong123/p/6679129.html
Copyright © 2020-2023  润新知