今天作到了bfs的練習,順便寫下心得。。。git
bfs能解決搜索和最短路徑的問題。學習
下面是學習心得:ui
typedef struct point //定義點 { int x; int y; }P; bfs() { int level[N]; //記錄隊列中元素層數,即從起點到該點最短路徑距離 P father[NX][NY],queue[N]; //father用來記錄父節點,queue用來記錄隊列 int top=0; //top用來記錄隊列長度,並指向最後節點 for(int i=0;i<nx;i++) for(int j=0;j<ny;j++) { father[i][j].x=-1; //初始化father father[i][j].y=-1; } queue[top].x=x0; //對起點進行賦值 queue[top].y=y0; father[x0][y0].x=x0; father[x0][y0].y=y0; top++; for(int i=0;i<top;i++) { for(遍歷第i個元素的鄰接點) { if(鄰接點沒標記) //若鄰接點father爲-1 { 父節點記爲第i個元素; queue[top]賦值爲該鄰接點; //把元素接到隊列上 level[top]=level[i]+1; //元素層次爲父節點層次+1 top++; //隊列長度+1 } if(鄰接點知足條件) { return ...; } } } }上一道訓練題:
#include<stdio.h> #include<string.h> int dx[8]={-1,-1,-2,-2,1,1,2,2}; //對應的xy變化表 int dy[8]={2,-2,1,-1,2,-2,1,-1}; typedef struct point { int x; int y; }P; int bfs(char* s1,char* s2) { int x1=(int)(s1[0]-'a'+1); //轉化爲數字 int x2=(int)(s2[0]-'a'+1); int y1=(int)(s1[1]-'0'); int y2=(int)(s2[1]-'0'); int level[80],top=0,flag; //top用來記錄隊列長度,並可用於指向隊尾 P father[10][10],queue[80]; //father記錄父節點,queue記錄隊列 for(int i=0;i<10;i++) for(int j=0;j<10;j++) { father[i][j].x=-1; //父節點初始化爲-1 father[i][j].y=-1; } level[top]=0; father[x1][y1].x=x1; father[x1][y1].y=y1; queue[top].x=x1; queue[top++].y=y1; if(x1==x2&&y1==y2) return 0; for(int i=0;i<top;i++) { flag=0; for(int j=0;j<8;j++) //標記全部鄰接點 { int tempx,tempy; tempx=queue[i].x+dx[j]; tempy=queue[i].y+dy[j]; if(tempx<=8&&tempx>0&&tempy<=8&&tempy>0&&father[tempx][tempy].x==-1) { father[tempx][tempy].x=queue[i].x; father[tempx][tempy].y=queue[i].y; queue[top].x=tempx; queue[top].y=tempy; level[top++]=level[i]+1; //level用來記錄當前元素層次 } if(tempx==x2&&tempy==y2) { flag=1; break; } } if(flag==1) return level[top-1]; } } int main() { char s1[3],s2[3]; int num; while(scanf("%s%s",s1,s2)!=EOF) { num=bfs(s1,s2); //輸入 printf("To get from %s to %s takes %d knight moves.\n",s1,s2,num); } return 0; }