




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
#include<stdlib.h>#include<stdio.h>#include<math.h>typedefstructNode{//節(jié)點結(jié)構(gòu)體intdata[9];doublef,g;structNode*parent;}Node,*Lnode;typedefstructStack{//OPENCLOSED表結(jié)構(gòu)體Node*npoint;structStack*next;}Stack,*Lstack;Node*Minf(Lstack*Open){//選取OPEN表上f值最小的節(jié)點,返回該節(jié)點地址Lstacktemp=(*Open)->next,min=(*Open)->next,minp=(*Open);Node*minx;while(temp->next!=NULL){if((temp->next->npoint->f)<(min->npoint->f)){min=temp->next;minp=temp;}temp=temp->next;}minx=min->npoint;temp=minp->next;minp->next=minp->next->next;free(temp);returnminx;}intCanslove(Node*suc,Node*goal){//判斷是否可解inta=0,b=0,i,j;for(i=1;i<9;i++)for(j=0;j<i;j++){if((suc->data[i]>suc->data[j])&&suc->data[j]!=0)a++;if((goal->data[i]>goal->data[j])&&goal->data[j]!=0)b++;if(a%2==b%2)return1;elsereturn0;intEqual(Node*suc,Node*goal){//判斷節(jié)點是否相等,相等,不相等for(inti=0;i<9;i++)if(suc->data[i]!=goal->data[i])return0;return1;}Node*Belong(Node*suc,Lstack*list){//判斷節(jié)點是否屬于OPEN表或CLOSED表,是則返回節(jié)點地址,否則返回空地址Lstacktemp=(*list)->next;if(temp==NULL)returnNULL;while(temp!=NULL){if(Equal(suc,temp->npoint))returntemp->npoint;temp=temp->next;}returnNULL;}voidPutinto(Node*suc,Lstack*list){//把節(jié)點放入OPEN或CLOSED表中Stack*temp;temp=(Stack*)malloc(sizeof(Stack));temp->npoint=suc;temp->next=(*list)->next;(*list)->next=temp;}///////////////計算f值部分-開始//////////////////////////////doubleFvalue(Nodesuc,Nodegoal,floatspeed){//計算f值doubleDistance(Node,Node,int);doubleh=0;for(inti=1;i<=8;i++)h=h+Distance(suc,goal,i);returnh*speed+suc.g;//f=h+g;(speed值增加時搜索過程以找到目標(biāo)為優(yōu)先因此可能不會返回最優(yōu)解)}doubleDistance(Nodesuc,Nodegoal,inti){//計算方格的錯位距離intk,h1,h2;for(k=0;k<9;k++)if(suc.data[k]==i)h1=k;if(goal.data[k]==i)h2=k;}returndouble(fabs(h1/3-h2/3)+fabs(h1%3-h2%3));}///////////////計算f值部分-結(jié)束/////////////////////////////////////////////////////擴展后繼節(jié)點部分的函數(shù)-開始/////////////////intBelongProgram(Lnode*suc,Lstack*Open,Lstack*Closed,Nodegoal,floatspeed){//判斷子節(jié)點是否屬于OPEN^CLOSED表并作出相應(yīng)的處理Node*temp=NULL;intflag=0;if((Belong(*suc,Open)!=NULL)||(Belong(*suc,Closed)!=NULL)){if(Belong(*suc,Open)!=NULL)temp=Belong(*suc,Open);elsetemp=Belong(*suc,Closed);if(((*suc)->g)<(temp->g)){temp->parent=(*suc)->parent;temp->g=(*suc)->g;temp->f=(*suc)->f;flag=1;}}else{Putinto(*suc,Open);(*suc)->f=Fvalue(**suc,goal,speed);}returnflag;}intCanspread(Nodesuc,intn){//判斷空格可否向該方向移動,,,表示空格向上向下向左向右移inti,flag=0;for(i=0;i<9;i++)if(suc.data[i]==0)break;switch(n){case1:if(i/3!=0)flag=1;break;case2:if(i/3!=2)flag=1;break;case3:if(i%3!=0)flag=1;break;case4:if(i%3!=2)flag=1;break;default:break;}returnflag;}voidSpreadchild(Node*child,intn){//擴展child節(jié)點的字節(jié)點n表示方向,,,表示空格向上向下向左向右移inti,loc,temp;for(i=0;i<9;i++)child->data[i]=child->parent->data[i];for(i=0;i<9;i++)if(child->data[i]==0)break;if(n==0)loc=i%3+(i/3-1)*3;elseif(n==1)loc=i%3+(i/3+1)*3;elseif(n==2)loc=i%3-1+(i/3)*3;elseloc=i%3+1+(i/3)*3;temp=child->data[loc];child->data[i]=temp;child->data[loc]=0;}voidSpread(Lnode*suc,Lstack*Open,Lstack*Closed,Nodegoal,floatspeed){//擴展后繼節(jié)點總函數(shù)inti;Node*child;for(i=0;i<4;i++){if(Canspread(**suc,i+1))//判斷某個方向上的子節(jié)點可否擴展{child=(Node*)malloc(sizeof(Node));//擴展子節(jié)點child->g=(*suc)->g+1;//算子節(jié)點的g值child->parent=(*suc);//子節(jié)點父指針指向父節(jié)點Spreadchild(child,i);//向該方向移動空格生成子節(jié)點if(BelongProgram(&child,Open,Closed,goal,speed))//判斷子節(jié)點是否屬于OPEN或CLOSED表并作出相應(yīng)的處理free(child);///////////////////////擴展后繼節(jié)點部分的函數(shù)-結(jié)束//////////////////////////////////Closed,floatspeed)//判斷OPEN表是否為//從OPEN表中取出f//將節(jié)點放入//如果當(dāng)前節(jié)點是目//當(dāng)前節(jié)點不是目標(biāo)Node*Process(Lnode*org,Lnode*goal,Closed,floatspeed)//判斷OPEN表是否為//從OPEN表中取出f//將節(jié)點放入//如果當(dāng)前節(jié)點是目//當(dāng)前節(jié)點不是目標(biāo)while(1){if((*Open)->next==NULL)returnNULL;空,為空則失敗退出Node*minf=Minf(Open);值最小的節(jié)點Putinto(minf,Closed);CLOSED表中if(Equal(minf,*goal))returnminf;標(biāo)節(jié)點,則成功退出Spread(&minf,Open,Closed,**goal,speed);節(jié)點時擴展當(dāng)前節(jié)點的后繼節(jié)點}}intShownum(Node*result){//遞歸顯示從初始狀態(tài)到達目標(biāo)狀態(tài)的移動方法if(result==NULL)return0;else{intn=Shownum(result->parent);for(inti=0;i<3;i++){printf(〃\n〃);for(intj=0;j<3;j++){if(result->data[i*3+j]!=0)printf("%d〃,result-〉data[i*3+j]);elseprintf("");}}printf(〃\n〃);returnn+1;}}voidCheckinput(Node*suc){//檢查輸入inti=0,j=0,flag=0;charc;while(i<9){while(((c=getchar())!=10)){if(c==''){if(flag>=0)flag=0;}elseif(c>='0'&&c<='8'){if(flag==0){suc->data[i]=(c-'0');flag=1;for(j=0;j<i;j++)if(suc->data[j]==suc->data[i])flag=-2;i++;}elseif(flag>=0)flag=-1;}elseif(flag>=0)flag=-1;}if(flag<0||i<9){if(flag<0){if(flag==-1)printf("含有非法字符或數(shù)字!\n請重新輸入:\n〃);elseif(flag==-2)printf("輸入的數(shù)字有重復(fù)!\n請重新輸入:\n〃);}elseif(i<9)printf("輸入的有效數(shù)字不夠!\n請重新輸入:\n〃);i=0;flag=0;}}}voidmain(){//主函數(shù)//初始操作,建立open和closed表LstackOpen=(Stack*)malloc(sizeof(Stack));Open->next=NULL;LstackClosed=(Stack*)malloc(sizeof(Stack));Closed->next=NULL;Node*org=(Node*)malloc(sizeof(Node));org->parent=NULL;//初始狀態(tài)節(jié)點org->f=1;org->g=1;Node*goal=(Node*)malloc(sizeof(Node));//目標(biāo)狀態(tài)節(jié)點Node*result;floatspeed=1;//speed搜索速度charc;printf(〃=================================\n〃);printf(-說明:狀態(tài)矩陣由0-8九個數(shù)字表示,\n請依次按照九宮格上的行列順序輸入,每個數(shù)字間用空格隔開。\n〃);printf(〃=================================\n〃);printf(-請輸入初始狀態(tài)(0-89個數(shù)字以空格隔開回車表示輸入結(jié)束):\n");Checkinput(org);printf(-請輸入目標(biāo)狀態(tài)(0-89個數(shù)字以空格隔開回車表示輸入結(jié)束):\n");Checkinput(goal);if(Canslove(org,goal)){//A*算法開始,先將初始狀態(tài)放入OPEN表printf("請輸入搜索速度(速度越高越無法保證結(jié)果是最優(yōu)解):〃);scanf(〃%f〃,&speed);while((c=getchar())!=10);printf(-搜索中,請耐
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 木材加工企業(yè)的信息化建設(shè)與管理考核試卷
- 化工產(chǎn)品批發(fā)商銷售團隊激勵與培訓(xùn)實踐考核試卷
- 冷凍飲品行業(yè)企業(yè)發(fā)展戰(zhàn)略與實施路徑考核試卷
- 半導(dǎo)體照明器件的振動測試考核試卷
- 家具品牌形象塑造考核試卷
- 機床附件的行業(yè)競爭格局與市場定位考核試卷
- 國際貿(mào)易中的社會責(zé)任與合規(guī)性考核試卷
- 成人高考物理電磁學(xué)綜合應(yīng)用考核試卷
- 小學(xué)生師生互動課件
- 耗材供應(yīng)合同范本
- 2025年度花卉產(chǎn)業(yè)大數(shù)據(jù)平臺建設(shè)合同3篇
- 魚骨圖培訓(xùn)課件
- 小學(xué)班會-交通安全伴我行(共25張課件)
- 建筑施工現(xiàn)場安全警示(案例)
- 《生產(chǎn)與運作管理 第4版》課件 第1、2章 概論、需求預(yù)測與管理
- 護理禮儀與人文關(guān)懷
- 患者隱私保護的考試試題及答案
- 2025年中考數(shù)學(xué)一輪教材復(fù)習(xí)-第六章 圓 與圓有關(guān)的概念及性質(zhì)
- 運維服務(wù)體系建立實施方案(5篇)
- 路面基層(級配碎石)施工方案
- 2025年村兩委工作計劃
評論
0/150
提交評論