幻灯片拼图应用程序,DFS

时间:2013-01-04 19:53:03

标签: c

我有解决滑动拼图的问题。我处于状态,在那里我可以确定拼图是否可以解决。我已经创建了将空标题向左,向右,向上和向下移动的功能,如果可以移动则返回2D数组,否则返回0。我将初始配置存储在2D数组中。

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

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

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

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(NULL,array);

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

感谢您的时间。 :)

1 个答案:

答案 0 :(得分:0)

我同意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;
}
如果状态对应于已解决的谜题,则应返回

isFinalState(),如果向左移动有效,则应返回tryMoveLeft(),如果有,则返回新分配的状态,freeState()应释放状态阵列。 输出将存储在数组步骤中,必须在搜索开始之前将其分配到足够的大小。

这并不能完全回答你的要求,但我希望无论如何都有所帮助:-D