關於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 從實際出發,做你不是最喜愛的工作。把不愛做的工作做得...

我夢見一條大蟒蛇一直追我,最後我爬上了迷宮的牆上是什麼意思

仇瓊詩 不管夢到了什麼,都只是一個夢而已,夢中的事情沒有什麼代表意思的,就不要去想的太多啦。 一條大蟒蛇一直追我,最後我爬上了迷宮的牆上是什麼意思?夢見蛇是錢串子,只要他不咬你就沒事。 清盈 只是一個夢而已,沒有必要去在意那麼多的,因為夢中的事情在現實生活中都是不存在的,不要讓一個夢影響到自己的心情...

請幫忙解決一條法律問題關於遺產繼承

王智傑愛我 一,由於房產於再婚後購買,屬於夫妻共同財產,嶽群與李燕各有一半的產權。現金存款也是一人一半。即嶽群死亡時有現金25萬元,房產100平方,成為遺產。繼承法 第二十六條 夫妻在婚姻關係存續期間所得的共同所有的財產,除有約定的以外,如果分割遺產,應當先將共同所有的財產的一半分出為配偶所有,其餘...