前面我們實現了基礎版本的迷宮求解,只有一條路徑。現在如果有多個出口,我們該如何去找到一條最短的路徑。
我們先來思考一下我們是如何在乙個陣列裡找最小值的?
有下面乙個陣列:
我們可以先把第乙個數設為最小值,然後遍歷陣列,拿它和後面的元素進行比較,把兩個數中較小的賦給min,直到遍歷完整個陣列,min中就是陣列中的最小值。
同樣的,找最短路徑也是一樣的思路。我們可以定義兩個棧,乙個cur_path儲存當前路徑,乙個short_path儲存最短路徑,每次找到一條路徑,將它儲存在cur_path裡,並和short_path進行比較,將兩條路徑中較短的路徑儲存在short_path中,最後列印short_path的內容。
可以看出,黃色圈出來的就是最短路徑。
步驟也是和前面大體一致,只是加了乙個當前路徑cur_path和最短路徑short_path的比較,**中有詳解,大家可以參考一下.
話不多說,直接上**:
//先對迷宮初始化
void mazeshortpathinit(maze* maze)
, ,
,, ,,
};size_t i = 0;
for( ;i < max_row;i++)
}return;
}//遍歷所有的路徑,然後從其中找出一條最短路徑
//實現遞迴版本
void getshortpath(maze* maze,point entry)
void _getshortpath(maze* maze,point cur,point entry,seqstack* cur_path,seqstack* short_path)
//2.如果能落腳,標記當前點並且入棧到cur_path
mark(maze,cur);
seqstackpush(cur_path,cur);
//3.判斷當前點是否為出口
if(i***it(maze,cur,entry))
seqstackpop(cur_path);
return;
}//4.如果當前點不是出口,嘗試順時針去探測其他四個方向
point up = cur;
up.row -= 1;
_getshortpath(maze,up,entry,cur_path,short_path);
point right = cur;
right.col += 1;
_getshortpath(maze,right,entry,cur_path,short_path);
point down = cur;
down.row += 1;
_getshortpath(maze,down,entry,cur_path,short_path);
point left = cur;
left.col -= 1;
_getshortpath(maze,left,entry,cur_path,short_path);
//5.如果四個方向都遞迴的探測完了,就可以進行出棧(cur_path),回溯到上乙個點
seqstackpop(cur_path);
}
這裡用到的輔助函式列印棧資訊seqstackprintdebug()和棧替換seqstackassgin()如下,而判斷當前點能不能落腳canstay()函式,判斷是否是出口i***it()函式和標記mark()函式在之前部落格中(基礎版迷宮求解)寫過,這裡就不做具體介紹。
void
seqstackassgin(seqstack* from,seqstack* to)
return;
}void
seqstackprintdebug(seqstack* stack,char* msg)
printf("\n");
}
結果如下圖:
資料結構 求多出口迷宮的最短路徑
上面我們已經寫過遞迴和非遞迴來實現求解迷宮的問題,今天我們就在遞迴的基礎上實現多條通路,最短問題。初始化最短路徑地圖 多通路最短路徑 void mazeinitshortpath maze maze int i 0 for iint j 0 for jmap i j map i j 用這個特殊的函式...
資料結構 求多出口帶環迷宮的最短路徑(遞迴版本)
maze.h pragma once includetypedef struct pospos typedef struct mazemaze maze.c define crt secure no warnings 1 include include maze.h include stack.h ...
迷宮深度優先搜尋 找出一條可行路徑
請寫乙個程式,先輸入迷宮的維度m和n,然後輸入這個m n的迷宮,迷宮位置上的數值為0代表該位置可以通過,為1代表該位置有障礙不能通過,用深度優先搜尋演算法搜出一條從迷宮左上角到右下角的路徑。規定搜尋順序為上 下 左 右。如 迷宮為2 2的 搜尋從左上角開始,到達右下角的路徑應該是 0,0 1,0 1...