资源简介
利用状态空间法对汉诺塔定义状态,用广度优先的方法解决汉诺塔问题,人工智能.(属于学校学习课程所做,非商业内容)
代码片段和文件信息
#include
#include
#include
#include
#include
#define FALSE 0
#define TRUE 1
char graph[10][43]={
{“ \n“}
{“ \n“}
{“ | | | \n“}
{“ | | | \n“}
{“ | | | \n“}
{“ | | | \n“}
{“ | | | \n“}
{“ | | | \n“}
{“ | | | \n“}
{“-----------------------------------------\n“}
};
typedef struct QNode {
int data; //存放数据
struct QNode *next; //存放直接后继的指针
} QNode *QueuePtr;
typedef struct { //辅助队列 广度优先扩展时用到
QueuePtr front;
QueuePtr rear;
} linkQueue;
/* 初始化队列 */
int InitQueue(linkQueue *Q)
{
/* 申请头结点空间,赋值给头/尾指针 */
Q->rear = Q->front = (QueuePtr)malloc(sizeof(QNode));
if (Q->front == NULL)
exit(-1);
Q->front->next = NULL; //头结点的next域
return TRUE;
}
/* 销毁队列 */
int DestroyQueue(linkQueue *Q)
{
/* 整个链表(含头结点)依次释放
没有像链表、栈等借助 QNode *p *q; 而直接借用了front和rear */
while (Q->front) { //若链表为空,则循环不执行
Q->rear = Q->front->next; //抓住链表的下一个结点
free(Q->front);
Q->front = Q->rear;
}
Q->rear = Q->front = NULL;
return TRUE;
}
/* 判断是否为空队列 */
int QueueEmpty(linkQueue Q)
{
/* 判断front和rear指针是否相等 */
if (Q.front == Q.rear)
return TRUE;
else
return FALSE;
}
/* 元素入队列 */
int EnQueue(linkQueue *Q int e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if (p == NULL)
return FALSE;
p->data = e;
p->next = NULL; //新结点的next必为NULL
Q->rear->next = p; //接在当前队尾的后面
Q->rear = p; //指向新的队尾
return TRUE;
}
/* 元素出队列 */
int DeQueue(linkQueue *Q int *e)
{
QueuePtr p;
/* 空队列则返回 */
if (Q->front == Q->rear) //用Q->front->next==NULL也可以
return FALSE;
p = Q->front->next; //指向首元
Q->front->next = p->next; //front指向新首元,可能为NULL
/* 如果只有一个结点,则必须修改尾指针 */
if (Q->rear == p)
Q->rear = Q->front;
/* 返回数据并释放结点 */
*e = p->data;
free(p);
return TRUE;
}
void IsExist(int *stateint tnumint numlinkQueue &Q)
{
if (state[tnum] == -1)
{
state[tnum] = num;
EnQueue(&Q tnum);
}
}
/* --------- 图像输出函数集 ------------ */
void PrintGraph()
{
system(“cls“);
printf(“过程演示:\n“);
int i;
printf(“\n“);
for (i=0; i<10; i++)
printf(“%s“ graph[i]);
}
void InitGraph(int n)
{
int ijk;
for (i=0j=8; i {
for(k=7-n+i; k<=7+n-i; k++)
graph[j][k]=‘@‘;
}
}
void Moveto(int from int to int size)//from to 只有012
{
//bool moved=false;//判断是否已移动
int ijkmslen;
int from1=from*13+7;
int to1=to*13+7;
for (i=2; i<9; i++)//找到起始层
if (graph[i][from1+1]==‘@‘)//层数记录
break;
for (j=2; j<=9; j++)//找到目标层数
if (graph[j][to1+1]==‘@‘||graph[j][to1+1]==‘-‘)//层数记录
{
j--;
break;
- 上一篇:c语言实现图像的旋转与平移
- 下一篇:VC6 实现FFT 显示频谱
评论
共有 条评论