版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上#include "Stdio.h"#include "Conio.h"#include "stdlib.h"#include "math.h"void Copy_node(struct node *p1,struct node *p2);void Calculate_f(int deepth,struct node *p);void Add_to_open(struct node *p);void Add_to_closed(struct node *p);void Remove_p(s
2、truct node *name,struct node *p);int Test_A_B(struct node *p1,struct node *p2);struct node * Search_A(struct node *name,struct node *temp);void Print_result(struct node *p);struct node / 定義8數(shù)碼的節(jié)點(diǎn)狀態(tài) int s33; /當(dāng)前8數(shù)碼的狀態(tài) int i_0; /當(dāng)前空格所在行號(hào) int j_0; /當(dāng)前空格所在列號(hào) int f; /當(dāng)前代價(jià)值 int d; /當(dāng)前節(jié)點(diǎn)深度 int h; /啟發(fā)信息,采用數(shù)
3、碼"不在位"距離和 struct node *father; /指向解路徑上該節(jié)點(diǎn)的父節(jié)點(diǎn) struct node *next; /指向所在open或closed表中的下一個(gè)元素 ;struct node s_0=2,8,3,1,6,4,7,0,5,2,1,0,0,0,NULL,NULL; /定義初始狀態(tài)struct node s_g=1,2,3,8,0,4,7,6,5,1,1,0,0,0,NULL,NULL; /定義目標(biāo)狀態(tài)struct node *open=NULL; /建立open表指針struct node *closed=NULL; /建立closed表指針int
4、 sum_node=0; /用于記錄擴(kuò)展節(jié)點(diǎn)總數(shù)/*/* */* 主函數(shù)開始 */* */*void main() int bingo=0; /定義查找成功標(biāo)志,bingo=1,成功 struct node s; /定義頭結(jié)點(diǎn)s struct node *target,*n,*ls,*temp,*same; /定義結(jié)構(gòu)體指針 Copy_node(&s_0,&s); /復(fù)制初始狀s_0態(tài)給頭結(jié)點(diǎn)s Calculate_f(0,&s); /計(jì)算頭結(jié)點(diǎn)的代價(jià)值 Add_to_open(&s); /將頭結(jié)點(diǎn)s放入open表 while(open!=NULL) /只要op
5、en表不為空,進(jìn)行以下循環(huán) n=open; /n指向open表中當(dāng)前要擴(kuò)展的元素 ls=open->next; Add_to_closed(n); open=ls; /將n指向的節(jié)點(diǎn)放入closed表中 if(Test_A_B(n,&s_g) /當(dāng)前n指向節(jié)點(diǎn)為目標(biāo)時(shí),跳出程序結(jié)束;否則,繼續(xù)下面的步驟 bingo=1; break; elseif(n->j_0>=1) /空格所在列號(hào)不小于1,可左移 temp=n->father; if(temp!=NULL&&temp->i_0=n->i_0&&temp->j
6、_0-1=n->j_0) /新節(jié)點(diǎn)與其祖父節(jié)點(diǎn)相同 ; else /新節(jié)點(diǎn)與其祖父節(jié)點(diǎn)不同,或其父節(jié)點(diǎn)為起始節(jié)點(diǎn) temp=(struct node *)malloc(sizeof(struct node); /給新節(jié)點(diǎn)分配空間 Copy_node(n,temp); /拷貝n指向的節(jié)點(diǎn)狀態(tài) temp->stemp->i_0temp->j_0=temp->stemp->i_0temp->j_0-1; /空格左移 temp->stemp->i_0temp->j_0-1=0; temp->j_0-; temp->d+; Calc
7、ulate_f(temp->d,temp); /修改新節(jié)點(diǎn)的代價(jià)值 temp->father=n; /新節(jié)點(diǎn)指向其父節(jié)點(diǎn) if(same=Search_A(closed,temp) /在closed表中找到與新節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) if(temp->f<same->f) /temp指向的節(jié)點(diǎn),其代價(jià)比closed表中相同狀態(tài)節(jié)點(diǎn)代價(jià)小,加入open表 Remove_p(closed,same); /從closed表中刪除與temp指向節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) Add_to_open(temp); sum_node+; else; else if(same=Search_A
8、(open,temp) /在open表中找到與新節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) if(temp->f<same->f) /temp指向的節(jié)點(diǎn),其代價(jià)比open表中相同狀態(tài)節(jié)點(diǎn)代價(jià)小,加入open表 Remove_p(open,same); /從open表中刪除與temp指向節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) Add_to_open(temp); sum_node+; else ; else /新節(jié)點(diǎn)為完全不同的新節(jié)點(diǎn),加入open表 Add_to_open(temp); sum_node+; /end左移 if(n->j_0<=1) /空格所在列號(hào)不大于1,可右移 temp=n->fa
9、ther; if(temp!=NULL&&temp->i_0=n->i_0&&temp->j_0+1=n->j_0) /新節(jié)點(diǎn)與其祖父節(jié)點(diǎn)相同 ; else /新節(jié)點(diǎn)與其祖父節(jié)點(diǎn)不同,或其父節(jié)點(diǎn)為起始節(jié)點(diǎn) temp=(struct node *)malloc(sizeof(struct node); /給新節(jié)點(diǎn)分配空間 Copy_node(n,temp); /拷貝p指向的節(jié)點(diǎn)狀態(tài) temp->stemp->i_0temp->j_0=temp->stemp->i_0temp->j_0+1; /空格右移 t
10、emp->stemp->i_0temp->j_0+1=0; temp->j_0+; temp->d+; Calculate_f(temp->d,temp); /修改新節(jié)點(diǎn)的代價(jià)值 temp->father=n; /新節(jié)點(diǎn)指向其父節(jié)點(diǎn) if(same=Search_A(closed,temp) /在closed表中找到與新節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) if(temp->f<same->f) /temp指向的節(jié)點(diǎn),其代價(jià)比closed表中相同狀態(tài)節(jié)點(diǎn)代價(jià)小,加入open表 Remove_p(closed,same); /從closed表中刪除與te
11、mp指向節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) Add_to_open(temp); sum_node+; else; else if(same=Search_A(open,temp) /在open表中找到與新節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) if(temp->f<same->f) /temp指向的節(jié)點(diǎn),其代價(jià)比open表中相同狀態(tài)節(jié)點(diǎn)代價(jià)小,加入open表 Remove_p(open,same); /從open表中刪除與temp指向節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) Add_to_open(temp); sum_node+; else ; else /新節(jié)點(diǎn)為完全不同的新節(jié)點(diǎn),加入open表 Add_to_open(tem
12、p); sum_node+;/end右移 if(n->i_0>=1) /空格所在列號(hào)不小于1,上移 temp=n->father; if(temp!=NULL&&temp->i_0=n->i_0-1&&temp->j_0=n->j_0) /新節(jié)點(diǎn)與其祖父節(jié)點(diǎn)相同 ; else /新節(jié)點(diǎn)與其祖父節(jié)點(diǎn)不同,或其父節(jié)點(diǎn)為起始節(jié)點(diǎn) temp=(struct node *)malloc(sizeof(struct node); /給新節(jié)點(diǎn)分配空間 Copy_node(n,temp); /拷貝p指向的節(jié)點(diǎn)狀態(tài) temp->st
13、emp->i_0temp->j_0=temp->stemp->i_0-1temp->j_0; /空格上移 temp->stemp->i_0-1temp->j_0=0; temp->i_0-; temp->d+; Calculate_f(temp->d,temp); /修改新節(jié)點(diǎn)的代價(jià)值 temp->father=n; /新節(jié)點(diǎn)指向其父節(jié)點(diǎn) if(same=Search_A(closed,temp) /在closed表中找到與新節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) if(temp->f<same->f) /temp指向的節(jié)點(diǎn)
14、,其代價(jià)比closed表中相同狀態(tài)節(jié)點(diǎn)代價(jià)小,加入open表 Remove_p(closed,same); /從closed表中刪除與temp指向節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) Add_to_open(temp); sum_node+; else; else if(same=Search_A(open,temp) /在open表中找到與新節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) if(temp->f<same->f) /temp指向的節(jié)點(diǎn),其代價(jià)比open表中相同狀態(tài)節(jié)點(diǎn)代價(jià)小,加入open表 Remove_p(open,same); /從open表中刪除與temp指向節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) Add_to_ope
15、n(temp); sum_node+; else ; else /新節(jié)點(diǎn)為完全不同的新節(jié)點(diǎn),加入open表 Add_to_open(temp); sum_node+;/end上移 if(n->i_0<=1) /空格所在列號(hào)不大于1,下移 temp=n->father; if(temp!=NULL&&temp->i_0=n->i_0+1&&temp->j_0=n->j_0) /新節(jié)點(diǎn)與其祖父節(jié)點(diǎn)相同 ; else /新節(jié)點(diǎn)與其祖父節(jié)點(diǎn)不同,或其父節(jié)點(diǎn)為起始節(jié)點(diǎn) temp=(struct node *)malloc(size
16、of(struct node); /給新節(jié)點(diǎn)分配空間 Copy_node(n,temp); /拷貝p指向的節(jié)點(diǎn)狀態(tài) temp->stemp->i_0temp->j_0=temp->stemp->i_0+1temp->j_0; /空格下移 temp->stemp->i_0+1temp->j_0=0; temp->i_0+; temp->d+; Calculate_f(temp->d,temp); /修改新節(jié)點(diǎn)的代價(jià)值 temp->father=n; /新節(jié)點(diǎn)指向其父節(jié)點(diǎn) if(same=Search_A(closed,
17、temp) /在closed表中找到與新節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) if(temp->f<same->f) /temp指向的節(jié)點(diǎn),其代價(jià)比closed表中相同狀態(tài)節(jié)點(diǎn)代價(jià)小,加入open表 Remove_p(closed,same); /從closed表中刪除與temp指向節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) Add_to_open(temp); sum_node+; else; else if(same=Search_A(open,temp) /在open表中找到與新節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) if(temp->f<same->f) /temp指向的節(jié)點(diǎn),其代價(jià)比open表中相同狀態(tài)節(jié)點(diǎn)代
18、價(jià)小,加入open表 Remove_p(open,same); /從open表中刪除與temp指向節(jié)點(diǎn)狀態(tài)相同的節(jié)點(diǎn) Add_to_open(temp); sum_node+; else ; else /新節(jié)點(diǎn)為完全不同的新節(jié)點(diǎn),加入open表 Add_to_open(temp); sum_node+; /end下移 if(bingo=1) Print_result(n); /輸出解路徑 else printf("問(wèn)題求解失??!");/主函數(shù)結(jié)束/*/* */* 計(jì)算某個(gè)節(jié)點(diǎn)狀態(tài)的代價(jià)值 */* */*void Calculate_f(int deepth,struct n
19、ode *p) int i,j,temp; temp=0; for(i=0;i<=2;i+) /計(jì)算所有"不在位"數(shù)碼的距離和 for(j=0;j<=2;j+) if(p->sij)!=(s_g.sij) temp+; p->h=temp; p->f=deepth+p->h;/*/* */* 添加p指向的節(jié)點(diǎn)到open表中 */* */* void Add_to_open(struct node *p) struct node *p1,*p2; p1=open; /初始時(shí)p1指向open表首部 p2=NULL; if(open=NULL)
20、 /open表為空時(shí),待插入節(jié)點(diǎn)即為open表第一個(gè)元素,open指向該元素 p->next=NULL; open=p; else /open表不為空時(shí),添加待插入節(jié)點(diǎn),并保證open表代價(jià)遞增的排序 while(p1!=NULL&&p->f>p1->f) p2=p1; /p2始終指向p1指向的前一個(gè)元素 p1=p1->next; if(p2=NULL) /待插入節(jié)點(diǎn)為當(dāng)前open表最小 p->next=open; open=p; else if(p1=NULL) /待插入節(jié)點(diǎn)為當(dāng)前open表最大 p->next=NULL; p2-&g
21、t;next=p; else /待插入節(jié)點(diǎn)介于p2、p1之間 p2->next=p; p->next=p1; /*/* */* 添加p指向的節(jié)點(diǎn)到closed表中 */* */*void Add_to_closed(struct node *p) if(closed=NULL) /closed表為空時(shí),p指向節(jié)點(diǎn)為closed表第一個(gè)元素,closed指向該元素 p->next=NULL; closed=p; else /closed表不為空時(shí),直接放到closed表首部 p->next=closed; closed=p; /*/* */* 在open表或closed表
22、中搜索和temp指向的節(jié)點(diǎn)相同的節(jié)點(diǎn) */* */*struct node * Search_A(struct node *name,struct node *temp) struct node *p1; p1=name; /p1指向open表或closed表 while(p1!=NULL) if(Test_A_B(p1,temp) /找到相同的節(jié)點(diǎn),返回該節(jié)點(diǎn)地址 return p1; else p1=p1->next; return NULL;/*/* */* 判斷兩個(gè)節(jié)點(diǎn)狀態(tài)是否相同,相同則返回1,否則返回0 */* */*int Test_A_B(struct node *p1,
23、struct node *p2) int i,j,flag; flag=1; for(i=0;i<=2;i+) for(j=0;j<=2;j+) if(p2->sij)!=(p1->sij) flag=0; return flag; else ; return flag;/*/* */* 從open表或closed表刪除指定節(jié)點(diǎn) */* */*void Remove_p(struct node *name,struct node *p) struct node *p1,*p2; p1=NULL; p2=NULL; if(name=NULL) /如果name指向的鏈表為空
24、,則不需要進(jìn)行刪除 return; else if(Test_A_B(name,p)&&name->f=p->f) /指定節(jié)點(diǎn)為name指向的鏈表的第一個(gè)元素 open=name->next; name->next=NULL; return; else p2=name; p1=p2->next; while(p1) if(Test_A_B(p1,p)&&p1->f=p->f) /找到指定節(jié)點(diǎn) p2->next=p1->next; return; else p2=p1; /p2始終指向p1指向的前一個(gè)元素 p1
25、=p1->next; return; /*/* */* 將p1指向的節(jié)點(diǎn)狀態(tài)拷貝到p2指向的節(jié)點(diǎn)中 */* */*void Copy_node(struct node *p1,struct node *p2) int i,j; for(i=0;i<=2;i+) for(j=0;j<=2;j+) p2->sij=p1->sij; p2->i_0=p1->i_0; p2->j_0=p1->j_0; p2->f=p1->f; p2->d=p1->d; p2->h=p1->h; p2->next=p1->next; p2->father=p1->father;/*/* */* 輸出結(jié)果 */* */*void Print_result(struct node *p) struct node *path100; struct node *temp,*temp_father; int i,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)語(yǔ)文教學(xué)中的創(chuàng)新教育心理學(xué)方法
- 二零二五年度智能調(diào)溫地板磚購(gòu)銷合同標(biāo)準(zhǔn)2篇
- 2024版招商引資合同模板
- 2024濕地草地工程合同
- 2025年浙教版九年級(jí)化學(xué)下冊(cè)月考試卷
- 小學(xué)科學(xué)課堂中的德育教育實(shí)踐案例分享
- 2024游樂(lè)場(chǎng)所安全員聘用合同版B版
- 小學(xué)德育活動(dòng)策劃與實(shí)施策略分享
- 2025版公路橋梁工程掛靠施工協(xié)議3篇
- 2025版專業(yè)家庭護(hù)理服務(wù)合作協(xié)議2篇
- 血細(xì)胞分析報(bào)告規(guī)范化指南2020
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實(shí)踐指導(dǎo)材料之7:“5領(lǐng)導(dǎo)作用-5.1領(lǐng)導(dǎo)作用和承諾”(雷澤佳編制-2025B0)
- 2024年快速消費(fèi)品物流配送合同6篇
- 廣東省茂名市2024屆高三上學(xué)期第一次綜合測(cè)試(一模)歷史 含解析
- 神經(jīng)重癥氣管切開患者氣道功能康復(fù)與管理學(xué)習(xí)與臨床應(yīng)用
- 第5章 一元一次方程大單元整體設(shè)計(jì) 北師大版(2024)數(shù)學(xué)七年級(jí)上冊(cè)教學(xué)課件
- 人教版高一地理必修一期末試卷
- 遼寧省錦州市(2024年-2025年小學(xué)六年級(jí)語(yǔ)文)部編版期末考試(上學(xué)期)試卷及答案
- 2024年下半年鄂州市城市發(fā)展投資控股集團(tuán)限公司社會(huì)招聘【27人】易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- GB/T 29498-2024木門窗通用技術(shù)要求
- 《職業(yè)院校與本科高校對(duì)口貫通分段培養(yǎng)協(xié)議書》
評(píng)論
0/150
提交評(píng)論