Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 幻灯片拼图应用程序,DFS_C - Fatal编程技术网

C 幻灯片拼图应用程序,DFS

C 幻灯片拼图应用程序,DFS,c,C,我有以下问题解决滑动难题。我处于一种状态,在这种状态下,我可以确定这个难题是否是可解的。我已经创建了将空标题向左、向右、向上和向下移动的函数,如果可以移动,它们将返回2D数组,如果不可以,则返回0。我将初始配置存储在2D数组中 我选择了有限的DFS来解决这个问题。所以我需要创建类似于树(或链表)结构的东西,在这里我的初始配置是根。然后它将有(2,3或4)个孩子,这取决于零的位置。这些节点将包含int**array(由函数返回:toLeft、toRight、toUp和toDown)和下一个配置 所

我有以下问题解决滑动难题。我处于一种状态,在这种状态下,我可以确定这个难题是否是可解的。我已经创建了将空标题向左、向右、向上和向下移动的函数,如果可以移动,它们将返回2D数组,如果不可以,则返回0。我将初始配置存储在2D数组中

我选择了有限的DFS来解决这个问题。所以我需要创建类似于树(或链表)结构的东西,在这里我的初始配置是根。然后它将有(2,3或4)个孩子,这取决于零的位置。这些节点将包含int**array(由函数返回:toLeft、toRight、toUp和toDown)和下一个配置

所以我可以使用递归创建下一个节点,直到有了目标配置。然后我可以“返回”到根目录并打印出步骤。例如:
[5] 左
[7] 向上

结束

但我在创建链表时遇到了问题。到目前为止,我只有:

typedef struct Node{
int **array;
struct Node *left;
struct Node *right;
struct Node *up;
struct Node *down;
}Node;
如何将节点添加到列表中,以及如何确定它是左、右、上、下? 多谢各位

编辑

所以根据建议(被删除),我编辑了我的代码并添加了新函数

   typedef struct Node{
    int **array;
    struct Node *left;
    struct Node *right;
    struct Node *up;
    struct Node *down;
    struct Node *parent;
    }Node;

Node* newNode(Node *parent, int **array){
    Node* u;
    u = malloc(sizeof(Node));
    if (u == NULL){
    printf("OUT OF MEMORY!");
    /* Free memory here.*/
    exit(1);
    }
    u->array = array;
    u->down = NULL;
    u->right = NULL;
    u->up = NULL;
    u->left = NULL;
    u->parent = parent;
    return u;
}

void setLeftNode(Uzel *parent, Uzel *child) {
  parent->left = child;
    }
/* setRightNode,Up,Down...*/


int isLeftChild (Node *node){
    if (node->parent == null) {return 0;}
    else{
        if (node->parent->left == node){return 1;}
        else{return 0;}
    }
}
/*is Right,Up,Down...*/
我添加了root: Node*root=newNode(空,数组)

所以我的问题是:
1.如何从父节点创建另一个节点(使用递归和数组(更改的拼图配置)?
2.如何调用setLeftNode、setRightNode等


谢谢您的时间。:)

我同意Spudd86。您不需要显式构建状态树数组。只在当前路径中有一个就足够了,这些可以保留在堆栈上的指针中

大致像这样的方法应该会奏效:

int dfs(int **state, int depthLimit, const char **steps) {
    if (isFinalState(state))
        return 1;

    if (depthLimit <= 0)
        return 0;

    int *newState;

    if (tryMoveLeft(state, &newState)) {
        if (dfs(newState, depthLimit, steps + 1)) {
            steps[0] = "left";
            freeState(newState);
            return 1;
        } else {
            freeState(newState);
        }
    }

    // The same for right, up, down ...

    // If no of the previous returns was taken, then this branch isn't the right one
    return 0;
}
int dfs(int**state、int depthLimit、const char**steps){
if(最终状态(状态))
返回1;

if(depthLimit)我已经用我的新代码编辑了post…。但是我被卡住了。当我创建一个节点根时也是如此。然后我尝试创建节点n=newNode(根,数组);这会导致我的程序在启动后终止,没有任何错误,但它什么也不做。我再次编辑了它,现在,newNode可以工作了……我希望如此。你确定需要树吗?为什么不使用数组状态堆栈呢?(即展开每个可能的下一个状态并将其推到堆栈上,然后弹出一个,展开等,直到用完或谜题解决)我已经用这里编写的伪代码实现了算法:但是,我仍然有infinte循环的问题。是否有const depthbund(DFS限制)值的公式取决于拼图的大小?谢谢。我不知道这个的公式。肯定会小于(n*n)!使用n*n字段进行拼图的步骤,但该值太大,对您没有帮助。如果我在学校的记忆正确,则您应该使用有限的dfs,从限制0开始,然后将限制增加1,直到找到有效的解决方案。