關於C 迷宮問題,尋找一條通路穿越迷宮(找到一條即可)。要求寫出遞迴程式來穿越迷宮

時間 2021-10-30 06:09:38

1樓:**夢幻

題目有問題:如何指定迷宮的起點和終點。

我這裡假設迷宮某個邊界位置是起點,(x, y)是否是終點要用gotgoal(x, y)函式判斷。

核心函式

void dfs(char *m, int height, int width, int x, int y, int now_dir)

這裡m是一個一維陣列,表示迷宮。格點x, y的資訊是m[y * width + x]

比如3行4列的迷宮

在m裡就是#####.....##,每一行緊接著上一行。

height 迷宮高度

width 迷宮寬度

x是當前位置橫座標。右邊是正方向。

y是當前位置縱座標。下方是正方向。

now_dir是是當前的方向。你需要給上下左右4個方向規定一個編號。

比如int dir_list[4][2] = , // 地圖左

, // 地圖上

,  // 地圖右

// 地圖下

};// 第一個數表示恆座標變化量,第二個數表示縱座標變化量

那麼對於當前方向now_dir,「摸著右手邊的牆」的探索方向編號依次是(可以參照上面dir_list的註釋來理解)

(now_dir + 1) % 4 當前方向右側

(now_dir + 0) % 4 當前方向

(now_dir - 1 + 4) % 4 當前方向左側

(now_dir - 2 + 4) % 4 當前方向反方向(回頭)。(這裡要+4是為了防止now_dir減去數字後變成負數,負數除以4的餘數還是負數)。

使用dfs的方法:

先將地圖資訊儲存到char陣列裡,作為dfs函式第一引數

將迷宮入口橫座標儲存到x引數,縱座標儲存到y引數

將剛進入迷宮的方向的編號(dir_list的第一下標)儲存到now_dir

dfs的基本實現(偽**)

void dfs(char *m, int height, int width, int x, int y, int now_dir)

return;

}注意:

這個問題由於不涉及最短路,而且每走一步都算走過,包括走進了死衚衕。因此這個問題完全不需要用遞迴,實際上程式也不可能回溯,因為每一步都是對的。直接用for或while迴圈就行了。

用遞迴,當路線比較長時,可能超過作業系統限制而報錯。

對於有環路的迷宮,程式會死迴圈。

如果要判斷出死迴圈的情況,需要一個額外的陣列int m_arrived[4],儲存每個位置的每個方向是否走過。一開始都是0,走過m[i]且方向是dir的時候,m_arrived[i][dir] = 1即可。

有不明白的地方請追問。

2樓:匿名使用者

這個問題其實可以看成搜尋問題

如果你會用棧或者佇列,就可以用深度優先或者廣度優先去找一條通路。

如果不會棧或者佇列,那麼就用回溯法遞迴解決。

資料結構演算法(c語言) 迷宮求解

3樓:匿名使用者

註釋非常詳細,希望對你有所幫助。

#include

#include

#define m 15

#define n 15

struct mark //定義迷宮內點的座標型別

; struct element //"戀"棧元素,嘿嘿。。

; typedef struct lstack //鏈棧

*plstack;

/*************棧函式****************/

int initstack(plstack &s)//構造空棧

int stackempty(plstack s)//判斷棧是否為空

壓入新資料元素

棧頂元素出棧

else

return 0;

} /***************求迷宮路徑函式***********************/

void mazepath(struct mark start,struct mark end,int maze[m][n],int diradd[4][2])

while(s2)

return; //跳出兩層迴圈,本來用break,但發現出錯,exit又會結束程式,選用return還是不錯滴

} if(maze[a][b]==0) //找到可以前進的非出口的點

d++;

} }printf("沒有找到可以走出此迷宮的路徑\n");

} /*************建立迷宮*******************/

void initmaze(int maze[m][n])

for(j=0;j<=n+1;j++)

for(i=0;i<=m+1;i++) //輸出迷宮 }

void main()

,,,};//行增量和列增量 方向依次為東西南北 [/m]

initmaze(sto);//建立迷宮

printf("輸入入口的橫座標,縱座標[逗號隔開]\n");

printf("輸入出口的橫座標,縱座標[逗號隔開]\n");

scanf("%d,%d",&end.x,&end.y);

mazepath(start,end,sto,add); //find path

system("pause");

} 測試資料,演算法複雜度你就自己來寫吧,如果你連這都不自己做,那你一定是在應付作業。勸你還是自己執行測試一下吧,免得答辯時老師問你,什麼都不知道,那你就悲劇了。祝你好運!!

怎麼才能找到一條好的出路,如何尋找一條新的出路?

面對現實,不說大道理,自己的前途,自己來把握 當我們追求理想時,當然不能忽略了實際問題。最完美的是能將理想和實際相結合,找一份你最愛的工作。當理想和實際有分歧時,你要分三步走。1 面對現實,只要能得溫飽,有了一定的收入,你能從中得到物質的享受 2 從實際出發,做你不是最喜愛的工作。把不愛做的工作做得...

求解一條C程序,求解一條C 程式

其實很簡單的呢!分2步 第一。point bottomright new point 1024,1280 這個其實裡面做了2個事情。第一件事情 初始化無參建構函式 這個是一定 也就是如下 public point 把x和y分別初始化了 1和 1.第二件事情 再次賦值給了一個例項物件 public p...

尋找一條舊新聞 雪之女王

上映 2006年11月13日 韓國.下面是關於電視劇的其他資料 電視劇資料 劇名 雪之女王 國家 韓國地區 日韓 出品 韓國kbs2電視臺 kbs 官網 集數 16集 型別 愛情 偶像 悲劇導演 李亨民 編劇 金恩熙 尹恩慶 主 演 玄 彬 飾韓太雄 韓得九 成宥利 飾金寶珞 任柱煥 飾徐健宇 柳仁...