八数码问题的深度优先搜索,怎么运行没结果啊?希望高手给看看,谢谢哈!
#include <stdio.h>
#include<stdlib.h>
#define COL 3
#define ROW 3
#define TOTAL 9
struct STATE
{
int matrix[TOTAL];
struct STATE *parent;
};
typedef struct STATE State;
struct QUEUE
{
struct STATE *current;
struct QUEUE *next;
int flag;
};
typedef struct QUEUE Queue;
int DFSSolve(int *,int *);
int EnqueueChild(State *);
int MoveAndEnqueue(State *, int, int );
State *StateConstruct(int *, State *);
Queue *QueueConstruct(State *);
int IsEqual(int *, int *);
int ShowSolutionPath(State *);
int Destruct();
int openDequeue();
int closedDequeue();
Queue *openHead = NULL;
Queue *openTail = NULL;
Queue *closedHead = NULL;
Queue *closedTail = NULL;
int main()
{
int initial[TOTAL],goal[TOTAL];
int i;
printf("Initial:\n");
for(i=0;i<TOTAL;i++)
scanf("%d",&initial[i]);
printf("\nGoal:\n");
for(i=0;i<TOTAL;i++)
scanf("%d",&goal[i]);
DFSSolve(initial,goal);
return 0;
}
int DFSSolve( int *entryArray, int *goal)
{
State *entryState = StateConstruct(entryArray,NULL);
openHead = QueueConstruct(entryState);
openTail = openHead;
while( ! IsEqual(openHead->current->matrix,goal) )
{
if((openHead->flag)!=1)
{
openHead->flag=1;
EnqueueChild(openHead->current);
}
openHead= openHead->next;
}
ShowSolutionPath(openHead->current);
Destruct();
return 1;
} /*end BFSSolve()*/
int EnqueueChild(State *parent)
{
int i;
for(i=0;i<TOTAL;i++)
{
if(parent->matrix[i]==0)
{
if( (i+1)/COL == i/COL )
MoveAndEnqueue(parent,i,i+1);
if( (i-1+COL)/COL == (i+COL)/COL ) /*excluding 0-1*/
MoveAndEnqueue(parent,i,i-1);
if( i+COL < TOTAL )
MoveAndEnqueue(parent,i,i+COL);
if( i-COL >= 0 )
MoveAndEnqueue(parent,i,i-COL);
break;
}
}
return 0;
}
int MoveAndEnqueue(State *parent,int x, int y)
{
State *state = StateConstruct(parent->matrix,parent);
Queue *queue=(Queue*)malloc(sizeof(Queue));
queue= QueueConstruct(state);
queue->next=NULL;
state->matrix[x] = parent->matrix[y];
state->matrix[y] = parent->matrix[x];
queue->next=openHead;
openHead = queue ;
return 0;
} /*end MoveAndEnqueue()*/
State *StateConstruct(int *matrix,State *parent)
{
int i;
State *state = (State*)malloc(sizeof(State));
if( state==NULL )
{
Destruct();
exit(0);
}
for(i=0;i<TOTAL;i++)
state->matrix[i] =matrix[i];
state->parent =parent;
return state;
} /*end StateConstruct()*/
Queue *QueueConstruct(State *state)
{
Queue *queue = (Queue*)malloc(sizeof(Queue));
if( queue==NULL )
{
Destruct();
exit(0);
}
queue->current = state;
queue->next = NULL;
queue->flag=0;
return queue;
} /*end QueueConstruct()*/
int IsEqual(int *matrix, int *goal)
{
int i;
for(i=0;i<TOTAL;i++)
if(matrix[i] != goal[i])
return 0;
return 1;
} /*end IsEqual()*/
int ShowSolutionPath(State *state)
{
State *curState = state;
Queue *curQueue = NULL;
Queue *lastQueue = NULL;
Queue *temp;
int i;
while(curState != NULL)
{
curQueue = (Queue*)malloc(sizeof(Queue));
if( curQueue==NULL )
{
while(curQueue != NULL)
{
temp = curQueue;
curQueue = curQueue->next;
free(temp);
}
Destruct();
exit(0);
}
///////////前插法,将链表逆序
curQueue->current = curState;
curQueue->next = lastQueue;
lastQueue = curQueue;
curState = curState->parent;
}
while(curQueue != NULL)
{
for(i=0;i<TOTAL;i++)
{
if( i%COL == 0) printf("\n");
printf("%d ",curQueue->current->matrix[i]);
}
temp = curQueue;
curQueue = curQueue->next;
free(temp);
printf("\n");
}
return 0;
}
int Destruct()
{
Queue *temp;
while(openHead != NULL)
{
free(openHead->current);
temp = openHead;
openHead = openHead->next;
free(temp);
}
return 0;
}
int openDequeue()
{
Queue *headTemp;
headTemp = openHead;
openHead = openHead->next;
free(headTemp->current);
free(headTemp);
return 0;
}
int closedDequeue()
{
Queue *headTemp;
headTemp = openHead;
openHead = openHead->next;
free(headTemp->current);
free(headTemp);
return 0;
}
#include<stdlib.h>
#define COL 3
#define ROW 3
#define TOTAL 9
struct STATE
{
int matrix[TOTAL];
struct STATE *parent;
};
typedef struct STATE State;
struct QUEUE
{
struct STATE *current;
struct QUEUE *next;
int flag;
};
typedef struct QUEUE Queue;
int DFSSolve(int *,int *);
int EnqueueChild(State *);
int MoveAndEnqueue(State *, int, int );
State *StateConstruct(int *, State *);
Queue *QueueConstruct(State *);
int IsEqual(int *, int *);
int ShowSolutionPath(State *);
int Destruct();
int openDequeue();
int closedDequeue();
Queue *openHead = NULL;
Queue *openTail = NULL;
Queue *closedHead = NULL;
Queue *closedTail = NULL;
int main()
{
int initial[TOTAL],goal[TOTAL];
int i;
printf("Initial:\n");
for(i=0;i<TOTAL;i++)
scanf("%d",&initial[i]);
printf("\nGoal:\n");
for(i=0;i<TOTAL;i++)
scanf("%d",&goal[i]);
DFSSolve(initial,goal);
return 0;
}
int DFSSolve( int *entryArray, int *goal)
{
State *entryState = StateConstruct(entryArray,NULL);
openHead = QueueConstruct(entryState);
openTail = openHead;
while( ! IsEqual(openHead->current->matrix,goal) )
{
if((openHead->flag)!=1)
{
openHead->flag=1;
EnqueueChild(openHead->current);
}
openHead= openHead->next;
}
ShowSolutionPath(openHead->current);
Destruct();
return 1;
} /*end BFSSolve()*/
int EnqueueChild(State *parent)
{
int i;
for(i=0;i<TOTAL;i++)
{
if(parent->matrix[i]==0)
{
if( (i+1)/COL == i/COL )
MoveAndEnqueue(parent,i,i+1);
if( (i-1+COL)/COL == (i+COL)/COL ) /*excluding 0-1*/
MoveAndEnqueue(parent,i,i-1);
if( i+COL < TOTAL )
MoveAndEnqueue(parent,i,i+COL);
if( i-COL >= 0 )
MoveAndEnqueue(parent,i,i-COL);
break;
}
}
return 0;
}
int MoveAndEnqueue(State *parent,int x, int y)
{
State *state = StateConstruct(parent->matrix,parent);
Queue *queue=(Queue*)malloc(sizeof(Queue));
queue= QueueConstruct(state);
queue->next=NULL;
state->matrix[x] = parent->matrix[y];
state->matrix[y] = parent->matrix[x];
queue->next=openHead;
openHead = queue ;
return 0;
} /*end MoveAndEnqueue()*/
State *StateConstruct(int *matrix,State *parent)
{
int i;
State *state = (State*)malloc(sizeof(State));
if( state==NULL )
{
Destruct();
exit(0);
}
for(i=0;i<TOTAL;i++)
state->matrix[i] =matrix[i];
state->parent =parent;
return state;
} /*end StateConstruct()*/
Queue *QueueConstruct(State *state)
{
Queue *queue = (Queue*)malloc(sizeof(Queue));
if( queue==NULL )
{
Destruct();
exit(0);
}
queue->current = state;
queue->next = NULL;
queue->flag=0;
return queue;
} /*end QueueConstruct()*/
int IsEqual(int *matrix, int *goal)
{
int i;
for(i=0;i<TOTAL;i++)
if(matrix[i] != goal[i])
return 0;
return 1;
} /*end IsEqual()*/
int ShowSolutionPath(State *state)
{
State *curState = state;
Queue *curQueue = NULL;
Queue *lastQueue = NULL;
Queue *temp;
int i;
while(curState != NULL)
{
curQueue = (Queue*)malloc(sizeof(Queue));
if( curQueue==NULL )
{
while(curQueue != NULL)
{
temp = curQueue;
curQueue = curQueue->next;
free(temp);
}
Destruct();
exit(0);
}
///////////前插法,将链表逆序
curQueue->current = curState;
curQueue->next = lastQueue;
lastQueue = curQueue;
curState = curState->parent;
}
while(curQueue != NULL)
{
for(i=0;i<TOTAL;i++)
{
if( i%COL == 0) printf("\n");
printf("%d ",curQueue->current->matrix[i]);
}
temp = curQueue;
curQueue = curQueue->next;
free(temp);
printf("\n");
}
return 0;
}
int Destruct()
{
Queue *temp;
while(openHead != NULL)
{
free(openHead->current);
temp = openHead;
openHead = openHead->next;
free(temp);
}
return 0;
}
int openDequeue()
{
Queue *headTemp;
headTemp = openHead;
openHead = openHead->next;
free(headTemp->current);
free(headTemp);
return 0;
}
int closedDequeue()
{
Queue *headTemp;
headTemp = openHead;
openHead = openHead->next;
free(headTemp->current);
free(headTemp);
return 0;
}
...全文
相关推荐
用深度优先、广度优先算法解决八数码问题
深度优先搜索适用于那些希望快速找到解决方案,而不在乎解的质量的情况。而广度优先搜索则是当寻找最短路径或者最优解时的首选。在八数码问题中,如果目标是找到最少步数的解,那么BFS通常优于DFS。
C++实现八数码问题源代码解析
八数码问题(8-puzzle)是一种经典的智力游戏,游戏板由3x3的格子组成,其中8个格子分别填有1至8的数字,另外一个格子为空。游戏的目标是通过滑动数字使得数字按顺序排列,即从左至右、从上至下的顺序为1至8。深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。该算法沿着树的深度遍历树的节点,尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这个过程一直进行到已发现从源节点可达的所有节点为止。
基于图搜索技术的八数码问题求解
总的来说,图搜索技术和启发式深度优先搜索在解决八数码问题时展现出强大的能力。通过合理设计启发式函数和优化搜索策略,我们可以高效地找到问题的解决方案,这也是人工智能领域中解决复杂问题的一种典型方法。
matlab利用深度和广度搜索解决八数码问题
希望这篇文章能对你的学习带来启示和帮助,继续努力,你会在编程道路上不断进步!
八数码问题算法解析[可运行源码]
在实验结果部分,作者展示了每种算法在解决八数码问题时的具体表现。


