啊哈演算法之BFS

2021-09-12 17:53:14 字數 1292 閱讀 7361

1#include

#include

struct node

;int main()

;//初始化地圖

int book[50][50]=;//初始化記錄陣列

int next[4][2]=,,,};

int i,j,k;//迴圈中用到的迴圈變數

int startx,starty;//起點座標

int p,q;//終點座標

int flag=0;//表示是否到達終點

int tx,ty;//定義下乙個點座標

int n,m;//迷宮有n行m列

int head,tail;//定義佇列頭尾指標

head=tail=1;//頭尾指標初始化

printf(「請輸入迷宮行數n與列數:m\n」);

scanf("%d %d",&n,&m);

printf(「請輸入迷宮:\n」);

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

scanf("%d",&a[i][j]);

printf(「請輸入起點座標:\n」);

scanf("%d %d",&startx,&starty);

printf(「請輸入終點座標:\n」);

scanf("%d %d",&p,&q);

que[tail].x=startx;

que[tail].y=starty;

que[tail].f=0;

que[tail].s=0;//初始化第乙個節點

book[startx][starty]=1;//標記第乙個節點已經在路徑中

tail++;//尾指標指向下乙個節點

while(headn ||ty<1 || ty>m)

continue;//座標越界,結束本次迴圈

if(a[tx][ty]==0&&book[tx][ty]==0)//如果不是障礙物並且不在路徑中

if(tx==p&&ty==q)

}//for

if(flag==1)

break;//如果已經到達終點,不再進行while迴圈

head++;//程式走到這一步說明上乙個節點已經處理完畢,出佇列

}//while

printf("最小步數為:\n");

printf("%d",que[tail-1].s);

return 0;}

值得注意的是 判斷是否為目標節點的哪個if語句不能放在開始,也就是說與深度優先搜尋不同,不能一開始就判斷邊界,而應該對這個節點處理後再判斷,否則會少乙個步長

啊哈演算法 bfs 解救小哈

include struct note 定義乙個結構體佇列 int main book 51 51 a陣列存地圖,book標記那個點走過 int next 4 2 定義的方向 int head,tail 標記頭和尾 int i,j,k,n,m,startx,starty,endx,endy,tx,t...

啊哈!演算法 之列舉

for i 1 i 9 i 這就是採用列舉的方法,把所有的可能性都進行了嘗試。對於形如這樣的火柴棍,如何在全部使用給定的火柴 m 24 後拼出a b c的等式呢?1.等式中存在固定不變的地方,就是加號與等號,他們一共佔4根。2.a a c這種,只能存在一次。3.a b c與b a c視為不同的兩組。...

啊哈演算法之快速排序

快速排序之所以比較快,是因為相比氣泡排序,每次交換是跳躍式的。每次排序的時候設定乙個基準點,將小於等於基準點的數全部放到基準點的左邊,將大於等於基準點的數全部放到基準點的右邊。這樣在每次交換的時候就不會像氣泡排序一樣只能在相鄰的數之間進行交換,交換的距離就大得多了。因此總得比較和交換次數就少了。速度...