在冰滑拼图路径发现上取得优势

时间:2016-05-14 03:00:20

标签: c path-finding

[我为标题道歉,我刚刚指出了我在这个难题上遇到的问题。

根据遇到的星号数量,我正在制作一个行程最短的路径查找方法。

游戏规则很简单,从A到B遍历,但我只能在一条直线上移动,并且不能停止向那个方向移动,直到你击中一个星号(或B),好像它们在滑过每零。

例如,照片显示从A到B的最短路径,其中23是行进的总距离。 ] 1

出现在我脑海中的第一个想法是制作一个邻接矩阵,最初我在这里有我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int main()
{
    FILE *hehehe = fopen("input.txt","r");
    //==========================ADJACENCY MATRIX INITIALIZATION=======================================//
    int row, column, i, j;
    fscanf(hehehe,"%d",&row);
    fscanf(hehehe,"%d",&column);
    char c;
    c = fgetc(hehehe);
    int matrix[row][column];
    c = fgetc(hehehe);
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < column; j++)
        {
            if (c == '*'){
                matrix[i][j] = 1;
                c = fgetc(hehehe);
            }
            else if (c == 'A')
            {
                matrix[i][j] = 2;
                c = fgetc(hehehe);
            }
            else if (c == 'B')
            {
                matrix[i][j] = 3;
                c = fgetc(hehehe);
            }
            else{
                matrix[i][j] = 0;
                c = fgetc(hehehe);
            }
            if (c == '\n'){c = fgetc(hehehe);}
        }
    }

    for (i = 0; i < row; i++)
    {
        for (j = 0; j < column; j++)
        {
            //if (matrix[i][j] == 1)  printf("*");
            //else    printf(" ");
            printf("%d ",matrix[i][j]);
        }
        printf("\n");
    }


    fclose(hehehe);
}

对于继续在照片中的每条直线上制作边缘的任何想法或建议都非常受欢迎。感谢您提前提供任何帮助。

1 个答案:

答案 0 :(得分:0)

在这种情况下,我认为矩阵过度了。因为滑动时无法移动,所以只需要有向图。

制作算法时需要注意以下几点:

  • 停止点是目标,或与墙/星号相邻的任何空间。
  • 顶点应存储两个值;方向和位置。
  • 对于每个星号或障碍物,将相邻空格添加到顶点列表中(如果它们尚未存在于图形中)。他们只需要一个方向。
  • 对于每个B,添加一个包含所有可能方向的顶点。 (或者每个方向的一个顶点,取决于是否更容易)。
  • 对于每个顶点,找到存储方向上最近的顶点。在两个顶点之间绘制一条边(如果它尚不存在)。
  • 运行适当的搜索算法。如果距离很重要,请使用Dijkstra's。如果没有,请使用广度优先。如果有特殊评分规则,请考虑A *。

由于您的搜索空间看起来不那么大,我还没有完全优化算法。这就是我提到检查顶点和边缘是否已经添加的原因。优化这些是可能的,如果您需要,我可以提供帮助,但if语句的成本不足以保证过早优化。因为您的搜索空间易于简化,所以广度优先和Dijkstra算法绝对完美;他们找到了最短的路径,而且他们的性能成本远不及将它们放在2D网格上那么高。

如果您不确定如何制作数据结构,请按照我的方式进行处理。

1。     图表结构

Node
- Parent // a link to the previous node
         // trace the links back to construct a path
- Depth // last node's depth + 1
- Vertex // the vertex hit by the pathfinder

Path
- Nodes // while parent is not null
        // add a node to this list
        // then read it backward

2。     探路者结构

{{1}}