首先,構造地圖:
首先構造乙個多通路並且帶環的迷宮。
思路與之前的求多通路的最短路徑一樣,需要先遍歷完所有的可落腳點,將最短路徑儲存在最小路徑棧中,與之不同的是,標記方式發生了變化,這次不能是簡單標記為2,而是應該標記為它的路徑長度(大致),然後比較時,就可以直接比較數值,如果當前路徑走到該點的路徑步數比之前的值小,我就可以走這條路,繼續走。
輔助函式:由於一些判斷條件和以前的問題判斷條件已經發生變化了,所以需要建立考慮判斷條件。
int exitwithcycle(maze* m,point pt,point entry)//判斷依據沒有變
//2.如果當前點在邊界上,就是出口
if(pt.x==0||pt.y==0||pt.x== row-1||pt.y==col-1)
return0;}
//標記方式變了
void markwithcycle(maze* m,point cur,point pre)
//取出pre_value
//讓這個點的值=pre_value+1
m->maze[cur.x][cur.y]=m->maze[pre.x][pre.y]+1;
}//判斷條件變了
int canstaywithcycle(maze* m,point cur,point pre)
(void)m;
//0.在地圖外
if(cur.x
<0||cur.x>=row||cur.y
<0||cur.y>=col)
//1.如果當前點是1,這是可以直接落腳的
if(m->maze[cur.x][cur.y]==1)
//2.當前點如果已經走過了,比較cur對應的值和pre的值的大小關係
// a.cur_value 7,pre_value 5 應該落腳 更短
// b.cur_value 6,pre_value 5 不應該落腳 一樣,沒必要
// c.cur_value 5,pre_value 5 不應該落腳 更長
if(m->maze[pre.x][pre.y]+1
maze[cur.x][cur.y])
return
0;}
實現函式:
void _getshortpathwithcycle(maze* m,point cur,point pre,point entry,seqstack* cur_path,seqstack* short_path)
//2.標記當前點,標記規則變了,並且將當前點插入到cur_path
markwithcycle(m,cur,pre);
seqstackpush(cur_path,cur);
pre=cur;
//3.判定當前點是否是出口
if(exitwithcycle(m,cur,entry))
seqstackpop(cur_path);
return;
}//4.不是出口,探測四個方向。(順時針)
point up=cur;
up.x-=1;
_getshortpathwithcycle(m,up,pre,entry,cur_path,short_path);
point right=cur;
right.y+=1;
_getshortpathwithcycle(m,right,pre,entry,cur_path,short_path);
point down=cur;
down.x+=1;
_getshortpathwithcycle(m,down,pre,entry,cur_path,short_path);
point left=cur;
left.y-=1;
_getshortpathwithcycle(m,left,pre,entry,cur_path,short_path);
//5.如果四個方向都探測過了,就出棧回溯
seqstackpop(cur_path);
return;
}void getshortpathwithcycle(maze* maze,point entry)
;//虛擬乙個非法點
_getshortpathwithcycle(maze,entry,pre,entry,&cur_path,&short_path);//5個引數
mazeseqstackprint(&short_path,"最短路徑為:");
}
結果如下:
資料結構 求多出口帶環迷宮的最短路徑(遞迴版本)
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 ...
資料結構 迷宮求解
定義迷宮 include seqstack.h define max row 6 最大行數 define max col 6 最大列數 typedef struct mazemaze void mazeinit maze maze size t i 0 for imap i j map i j vo...
資料結構 迷宮求解
include include int mg 10 10 地圖 int m 8 行數 int n 8 列數 typedef struct box 定義方塊型別 typedef struct sttype 定義順序棧型別 bool mgpath int xi,int yi,int xe,int ye ...