我在解决滑动难题时遇到以下问题。我处于状态,我可以确定谜题是否可以解决。而且我已经创建了将空标题向左、向右、向上和向下移动的函数,如果可以移动,它们返回 2D 数组,否则返回 0。我将初始配置存储在二维数组中。
我选择了有限的 DFS 来解决这个问题。所以我需要创建类似树(或链表)结构的东西,我的初始配置将是根目录。然后它将有(2,3 或 4)个孩子,具体取决于零的位置。这些节点将包含具有下一个配置的 int **array(由函数返回:toLeft、toRight、toUp 和 toDown)。
所以我可以使用递归来创建下一个节点,直到有目标配置。然后我可以“返回”到根目录并打印出这些步骤。例如:
[5] LEFT
[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...*/
我添加了根: Node* root = newNode(NULL, array);
所以我的问题是:
1. 我怎样才能创建另一个节点(使用递归和来自他们父母的数组(更改拼图配置))?
2. 如何调用setLeftNode、setRightNode等?
感谢您的时间。:)