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平方,成為遺產。繼承法 第二十六條 夫妻在婚姻關係存續期間所得的共同所有的財產,除有約定的以外,如果分割遺產,應當先將共同所有的財產的一半分出為配偶所有,其餘...