2013-11-04 68 views
-1

假设我想代表一个有100个楼层的10 * 10房间。我可以从任何一层开始穿过房间,但是,有些楼层之间有墙壁。 CS说,我正在试图做一个10 * 10的网格房间,其中每个方格代表一个楼层。每个楼层都有一定的特征,它可以表示为一个节点,但整个网格包含这些节点的列表。什么是链接网格正方形最有效的方法?

我试图将每个方块连接到与之相关的方块。 这个关系可以描述如下: - 除了网格边缘上的那个之外,每个正方形在顶部,右边,上边和下边都有另一个边。

例如,网格左上角的第一层只与右侧的楼层和下面的楼层有关系。

- 另外,有些楼层不能连接在一起,假设它们之间有一个块。楼层号前一个例子中的一个不能与它下面的链接,因为它们之间有一堵墙。

我用一个指针到每个节点 - 方联系或落地式到其相关的节点:

public class Node{ 

private Node right; 
private Node left; 
private Node up; 
private Node down; 

//constructor other methods 
} 

然而,这种解决方案可能需要很多地方在内存中,假设我们有100个节点,每个节点有4个指针!

我已经通过为每个节点分配ID来更改此解决方案,然后在每个节点中都有一个int []数组,可以存储相关节点的数量。

该解决方案在网格类中引入了另一个问题! 假设改变后,在Node类的新方法将是:

public void setNeighbors(int[] neighbors) { this.neighbors = neighbors; } 

正当我要创建的每个节点,将其添加到列表中网格类,我得写100线,每个节点一个!

int [] n1 ={2}; grid.getEntry(1).setNeighbors(n1); 
int [] n2 ={1,3}; grid.getEntry(2).setChars(n2); 
. 
. 
. 
And so on.. 

我的问题是,我该如何通过尽可能高效和干净的代码来解决问题。

我怎样才能代表静态正方形之间的关系,而不必在每一步创建一个数组或不必写100行。

我发现广场之间的数学关系,但我不能使用它,因为一些方格不能链接到ONSE旁边,因为他们之间的墙..

+0

我看不出有什么不对您发布的节点类。它使遍历非常容易。我猜可能很难填充。取决于一个节点是否需要知道它的邻居是谁。我真的没有看到你认为你通过添加ID属性而不是使用对象引用获得了什么。 – tom

+0

我不喜欢400指针的想法。此外,我仍然必须做100行,但它看起来像这样'grid.getEntry(2).setNeighbors(grid.getEntry(1),grid.getEntry(3),null,null);' – Lamia

+0

“400指针的想法”远远好于创建400个ID(本质上是指针)并自己管理它们,这是您提出的替代方案。您可以将地板放在一个二维节点阵列中,在每个节点中创建一个干净的节点,然后遍历指定左/右/上/下节点的数组。不需要100行代码。 – tom

回答

0

你可以计算曼哈顿距离而不是euklidian距离。

1

我认为你应该专注于在尝试修改微量内存之前获取工作代码。它被称为提前优化

为了避免“100行的问题”,你可以初始化一个楼层做这样的事情(未经测试):

Node[][] floor = new Node[10][10]; 
    for (int i=0;i<10;i++){ 
     for (int j=0;i<10;i++){ 
      floor[i][j] = new Node(); 
     } 
    } 

    for (int i=0;i<10;i++){ 
     for (int j=0;j<10;j++){ 
      if (i<9) 
       floor[i][j].down = floor[i+1][j]; 
      if (i>1) 
       floor[i][j].up = floor[i-1][j]; 
      if (j<9) 
       floor[i][j].right = floor[i][j+1]; 
      if (j>1) 
       floor[i][j].up = floor[i][j-1]; 
     } 
    } 
+0

这是我以前的想法,但由于墙壁问题,我很难实施它。我想我会去争取它,然后我会分配那些在他们之间有墙的人。谢谢 – Lamia

相关问题