資源簡介
利用狀態空間法對漢諾塔定義狀態,用廣度優先的方法解決漢諾塔問題,人工智能.(屬于學校學習課程所做,非商業內容)
代碼片段和文件信息
#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 顯示頻譜
評論
共有 條評論