資料結構 求解迷宮問題帶環最短路徑問題

2021-08-19 01:29:56 字數 2401 閱讀 8282

首先,構造地圖:

首先構造乙個多通路並且帶環的迷宮。

思路與之前的求多通路的最短路徑一樣,需要先遍歷完所有的可落腳點,將最短路徑儲存在最小路徑棧中,與之不同的是,標記方式發生了變化,這次不能是簡單標記為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 ...