如何处理列表的整数并查找邻居?

问题描述 投票:0回答:2

我目前正在尝试解决输入如下的问题

int hours(int rows, int columns, List<List<Integer> > grid)

其中列表网格是0和1的矩阵(0表示不完整,1表示完成),如下所示:

0 1 1 0 1 
0 1 0 1 0 
0 0 0 0 1 
0 1 0 0 0 

每个值代表网络中的彼此发送文件的机器,因此,如果该值为“ 1”,则此节点能够将文件发送到ALL NEIGHBORS(对角线不只向上/向下计数/ right / left)。问题在于,一旦0变成1(受邻居单元影响),它就无法在1小时前将文件发送给其他邻居。

问题的目的是返回所有节点接收文件之前需要花费几个小时? (换句话说,所有矩阵都变为1。考虑运行时复杂度

为了直观说明:(在第一个小时之后,这应该是被视为迭代的矩阵状态:]

 1 1 1 1 1
 1 1 1 1 1
 0 1 0 1 1
 1 1 1 0 1

因此,我采用了一种方法,即遍历矩阵,在提供的网格中查找并在临时数组中附加值(因为我不知道如何在主List内更新或附加列表值)。然后,一旦行索引达到最大值,我将1小时添加到一个int变量并将值添加到主网格。

我知道下面的代码仍无法正常工作/完成,并且可能有语法错误,但是您了解了主意和方法。

我的问题是,有没有一种方法比我的更简单有效?我还找到了一个解决方案here,但如果我的想法值得,那该方法仅适用于2D阵列。但是,这4个嵌套循环不会使代码的复杂性混乱吗?

    List<List<Integer>> grid2 = grid1;
    boolean received= false;
    int hours=0;
    int rows_Temp = 0 ;
    int columsTemp = 0 ;
    int[][] grid2 = null ;
    while(rows_Temp<rows&&!received)
    {
        if(rows_Temp==rows-1)
        { 
            rows_Temp=0;
        }
        if(rows_Temp==0) 
        {
            //create an array with the grid dimention
            grid2= new int[rows][columns];
        }
        //manage top left corner
        if(rows_Temp==0 && columsTemp == 0 ) 
        {
            //find right & down
            int center= grid.get(rows_Temp).get(columsTemp);
            int right = grid.get(rows_Temp).get(columsTemp+1);
            int down  = grid.get(rows_Temp+1).get(columsTemp);


            if(center==1)
            {
                if(right==0)
                {
                    grid2[rows_Temp][columsTemp+1] = 1;
                }
                if(down==0)
                {
                    grid2[rows_Temp+1][columsTemp]=1;
                }
            }
        }
        //manage top right corner
        else if(rows_Temp==0 && columsTemp == columns-1)
        {
            //find left and down
            int center= grid.get(rows_Temp).get(columsTemp);
            int left = grid.get(rows_Temp).get(columsTemp-1);
            int down  = grid.get(rows_Temp+1).get(columsTemp);

            if(center==1)
            {
                if(left==0)
                {
                    grid2[rows_Temp][columsTemp-1] = 1;
                }
                if(down==0)
                {
                    grid2[rows_Temp+1][columsTemp]=1;
                }
            }
        }
        //mange down left corner of the array
        else if(rows_Temp==rows-1 && columsTemp == 0)
        {
            //find up and right
            int center= grid.get(rows_Temp).get(columsTemp);
            int right = grid.get(rows_Temp).get(columsTemp+1);
            int up  = grid.get(rows_Temp-1).get(columsTemp);

            if(center==1)
            {
                if(right==0)
                {
                    grid2[rows_Temp][columsTemp+1] = 1;
                }
                if(up==0)
                {
                    grid2[rows_Temp-1][columsTemp]=1;
                }
            }
        }
        //manage down right corner
        else if(rows_Temp==rows-1 && columsTemp == columns-1)
        {
            //find left and up
            int center= grid.get(rows_Temp).get(columsTemp);
            int left = grid.get(rows_Temp).get(columsTemp-1);
            int up  = grid.get(rows_Temp-1).get(columsTemp);

            if(center==1)
            {
                if(left==0)
                {
                    grid2[rows_Temp][columsTemp-1] = 1;
                }
                if(up==0)
                {
                    grid2[rows_Temp-1][columsTemp]=1;
                }
            }
        }
        //manage left sides but not corners
        else if(rows_Temp!=0&& rows_Temp!=rows-1&& columsTemp==0)
        {
            int center= grid.get(rows_Temp).get(columsTemp);
            int right = grid.get(rows_Temp).get(columsTemp+1);
            int up  = grid.get(rows_Temp-1).get(columsTemp);
            int down  = grid.get(rows_Temp+1).get(columsTemp);

            if(center==1)
            {
                if(right==0)
                {
                    grid2[rows_Temp][columsTemp+1] = 1;
                }
                if(up==0)
                {
                    grid2[rows_Temp-1][columsTemp]=1;
                }
                if(down==0)
                {
                    grid2[rows_Temp+1][columsTemp]=1;
                }
            }  
        }    

        if(columsTemp==columns-1)
        {
            columsTemp=0;
            rows_Temp++;
            System.out.println();
        }
        else
        {
            columsTemp++;
        }


    }
    System.out.println("------------");
    return 0 ;
}
java algorithm data-structures runtime time-complexity
2个回答
0
投票

这似乎起作用。


0
投票

如果允许更新grid,请使用grid.get(y).get(x)检查网格,并使用grid.get(y).set(x, value)更新网格。如果不允许更新网格,请先将值复制到int[][] 2D数组中,然后在下面的解决方案中使用它。

© www.soinside.com 2019 - 2024. All rights reserved.