迷宮求解 窮舉求解法

2021-07-24 20:33:49 字數 2590 閱讀 6769

迷宮求解是乙個理解資料結構中棧的比較好的實踐例子,下面進行分析

設迷宮是又乙個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...