我有以下问题与解决滑动拼图。我在这个状态下,我可以确定这个难题是否可以解决。我已经创建了一些函数来将空标题向左、向右、向上和向下移动,如果可以移动,它们将返回2D数组;如果不可以移动,则返回0我将初始配置存储在2D数组中。
我选择了有限的DFS来解决这个问题。所以我需要创建类似树(或链表)结构的东西,其中我的初始配置将是根然后它会有(2,3或4)个孩子,这取决于0的位置这些节点将包含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...*/
我加了根:
Node*root=newNode(空,数组);
所以我的问题是:
一。我如何创建另一个节点(使用递归和数组(更改的拼图配置)从他们的父节点?
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;
}
isFinalState()
如果状态对应于已解决的难题,则应返回;如果向左移动有效,则应返回,tryMoveLeft()
如果是,则应返回新分配的状态,freeState()
应释放状态数组。输出将存储在数组步骤中,在开始搜索之前,必须将其分配到足够的大小。
这并不能完全回答你的要求,但我还是希望能有所帮助
关于c - 幻灯片拼图应用程序,DFS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14163959/