演算法競賽 走迷宮

2021-07-30 15:42:19 字數 1631 閱讀 3130

乙個網格迷宮由n行m列的單元格組成,每個單元格要麼是空地(用1表示)要麼是障礙物

(用0表示)。任務是找一條從起點到終點的最短移動序列,其中udlr代表上下左右移動到

相鄰單元格。任何時候都不能在障礙物格中,也不能走到迷宮之外。起點和終點保證是空地

n,m<=100;

圖的bfs與樹的bfs一樣,但需要避免重複訪問乙個節點。下面**用標

記vis[x][y]記錄格仔(x,y)是否走過,和dfs一樣

樣例輸入:6行5列,入口(0,0),出口(0,4)

6 5      

1 1 0 1 1

1 0 1 1 1

1 0 1 0 0

1 0 1 1 1

1 1 1 0 1

1 1 1 1 1

#include#include#include#includeusing namespace std;

const int maxn = 105;

int dx = , dy = ;//dx上下,dy左右

char name = ;

int q[maxn*maxn];//佇列,儲存當前結點編號

int vis[maxn][maxn], nmap[maxn][maxn];

int dir[maxn*maxn];

int fa[maxn][maxn], dist[maxn][maxn], last_dir[maxn][maxn];

int n, m;//行、列數

void funinit();

void bfs(int x, int y);

void funcinput();

void print_path(int x,int y);

int main()

memset(vis, 0, sizeof(vis));//給初始陣列清零

memset(dist, 0, sizeof(dist));//給初始陣列清零

bfs(0,0);//起始點print_path(0, 4);//走出點system("pause");return 0;}void bfs(int x,int y)}}}/*為方便起見我們把格仔從上到下編號為0 1 2 3 4 ...n*m,因此第i行第j個格仔的編號為i*m+j,而編號為u的行號為u/m,列號為u%m。當格仔(x,y)擴充套件出格仔(nx,ny)後,我們不僅需要更新dist[nx][ny]=dist[x][y]+1還要儲存新格仔(nx,ny)的父親編號fa[nx][ny]以及父節點到它的移動方向last_dir[nx][ny].有了這兩個值,就可把路徑列印出來了。*///void

print_path(int x,int y)////}/* 這裡用到了遞迴的技巧:如果格仔(x,y)有父親(fx,fy),需要先列印從起點到(fx,fy)的最短路,然後列印(fx,fy)到(x,y)的移動方向,也就是last_dir[x][y]所對應的方向名字。這個函式非常方便,請當心一點:n和m太大時可能會產生棧溢位,需要改寫成下面的非遞迴形式*/void

print_path(int x, int y)while (c--)putchar(name[dir[c]]);cout << "最短路徑長度為:" << dist[0][4] << endl;}

走迷宮問題 演算法競賽入門經典

思路分析 本題可以採取bfs的方式進行解題,我們把每乙個節點的下一層節點全部遍歷完,並讓它們不再次遍歷 設定標誌陣列 bfs的解決方法是利用佇列知識,每次讀取乙個資料,並讓該資料出隊,然後把該節點的子節點依次入隊,直到最後遍歷完畢。下面貼上 1 include2 include3 include 4...

走迷宮演算法

從起點問題的提出 在遊戲地圖中,如何尋找一條從起點到終點的最短行路線路?資料表達 使用m n大小的byte陣列 來表示地圖,每個位置的狀態用0表示可走,1表示牆,2表示起點,3表示終點,128表示路徑 行走規則有兩種 4方向行走規則 只能從當前點向上,下,左,右 這4個方向行走 8方向行走規則 可以...

深度優先演算法走迷宮

prim生成迷宮 大致思路是 首先,生成迷宮全部都是圍牆設為1表示圍牆的值就是1。其次,把迷宮之外的輪廓設定為0表示邊框,然後設定起點和重點的值分別為2和2.接下來就要判斷起始點下下個低方判斷是否是圍牆,因為防止打穿圍牆或者達到之前的路上在圍牆中不斷的挖路從而生成迷宮。方法主要是從起點開始每乙個上下...