将网格方块链接在一起的最有效方法是什么?

时间:2013-11-04 19:02:16

标签: java grid artificial-intelligence

假设我想要代表一个有10层楼的10 * 10房间。我可以从任何楼层开始走过房间,但是,有些楼层之间有墙。

CS说,我正在尝试制作一个10 * 10格 - 室 - 每个方格代表一个楼层。每层都有一定的特征,它可以表示为一个节点,整个网格,但是包含这些节点的列表。

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

例如,位于网格左上方的第一层仅与其右侧的地板和位于其下方的地板有关。

- 另外,假设某些楼层之间存在阻挡,则无法将某些楼层链接在一起。楼层号上一个示例中的一个不能与其下的一个链接,因为它们之间有一个墙。

我使用指针将每个节点--square或floor-链接到其相关节点:

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 ..

2 个答案:

答案 0 :(得分: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];
        }   
    }

答案 1 :(得分:0)

您可以计算曼哈顿距离而不是欧氏距离。