• 大小: 8KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-06-12
  • 语言: C/C++
  • 标签: 汉诺塔  

资源简介

利用状态空间法对汉诺塔定义状态,用广度优先的方法解决汉诺塔问题,人工智能.(属于学校学习课程所做,非商业内容)

资源截图

代码片段和文件信息


#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;

评论

共有 条评论