迷宮求解是乙個理解資料結構中棧的比較好的實踐例子,下面進行分析
設迷宮是又乙個2維陣列組成的,元素只有0或1來表示是否通路,0代表通路,1代表有牆壁不通路
例如下圖中是一條通路
窮舉法:從入口出發,順某方向向前探索,如能走通,則繼續往前走,否則沿原路返回,換乙個方向再試,直到所有可能的銅鑼都探索到為止。為了保證在任何時候都有可能沿原路返回,所有要用後進先出的結構---棧來儲存從入口到當前位置的路徑。
當前路徑的最上面的乙個通道塊是當前路徑棧中的棧頂,納入路徑相當於入棧,刪除或退後就相當於出棧。
演算法的描述 do
否則 }
}while(棧不空)
為了方便,我們先前要定義好迷宮的資料,例如
int r[10][10]=,,,
,,,,
,,};
在此需要用到的資料為
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
typedef int directivetype;
typedef int status;
typedef structpostype;//通道塊型別,代表的座標(行,列)
typedef structselemtype;//棧元素型別,
typedef structsqstack;//棧的型別,
棧的一些基本操作
#define stack_init_size 100//初始棧的大小
#define stackincrement 10//每次棧補充的大小
status initstack(sqstack &s)
status gettop(sqstack s,selemtype &e)
status push(sqstack &s,selemtype e)
*s.top++ = e;
return ok;
}status pop(sqstack &s,selemtype &e)
status stackempty(sqstack s)
迷宮資料的一些操作,演算法的實現是由mazepath函式完成的
#define row 10
#define col 10
#define range 100
typedef struct mazetype;
status initmaze(mazetype &maze,int a[col],int row,int col)
for(int j=0;j<=col+1;j++)
maze.arr[0][j]=maze.arr[row+1][j]=1;
for(int i=0;i<= row+1;i++)
maze.arr[i][0]=maze.arr[i][col+1]=1;
maze.m=row;
maze.n=col;
return ok;
}status pass(mazetype maze,postype curpos)
status footprint(mazetype &maze,postype curpos)
status markprint(mazetype &maze,postype curpos)
selemtype creatselem(int step,postype pos,int di)
postype nextpos(postype curpos,directivetype di)
return pos;
}status posequare(postype pos1,postype pos2)
void printmaze(mazetype maze)
} printf("\n"); }}
status mazepath(mazetype &maze,postype start,postype end)
else
if(e.di<4)
}} }while(!stackempty(s));
return false;
主函式為
迷宮問題求解之「窮舉 回溯」(一)
求迷宮從入口到出口的所有路徑是乙個經典的程式設計問題,求解迷宮,通常採用的是 窮舉 回溯 的思想,即從入口開始,順著某乙個方向出發,若能夠走通,就繼續往前走 若不能走通,則退回原路,換乙個方向繼續向前探索,直到所有的通路都探尋為止。因此本文依據這種 窮舉 回溯 的思想,設計乙個求解迷宮的程式。為了保...
A 演算法求解迷宮
cpp view plaincopy include include include using namespace std 方向向量 int direc 4 2 封閉,開放列表標記 enum flag 最小堆節點類 堆優先順序為 f g h g為當前的路徑長 h為估計當前位置到目標位置開銷探測 當...
迷宮求解(棧)
這篇部落格是借鑑了always 的部落格修改得到了,感謝他的幫助。採用了以棧為基礎,在棧的基礎上進行迷宮的求解,用stack和maze兩個檔案來實現功能。stack.h的實現如下 pragma once include include include include typedef int dire...