我目前正在尝试解决输入如下的问题
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 ;
}
这似乎起作用。
如果允许更新grid
,请使用grid.get(y).get(x)
检查网格,并使用grid.get(y).set(x, value)
更新网格。如果不允许更新网格,请先将值复制到int[][]
2D数组中,然后在下面的解决方案中使用它。