c語言迷宮問題求解 遞迴 棧回溯

2021-08-20 07:05:04 字數 2019 閱讀 5568

第一次寫,見諒

以下是求迷宮的實現

為什麼下面會出現標籤啊,有什麼簡便的方法去掉嗎?求告知

最後是關於求所有通路,個人愚笨只想到改變搜尋方向順序這種笨方法,總共有16種

/*

第一部分使用遞迴求解

為了資料的簡單化,不對路口進行資料結構化,將用乙個簡單的int型別陣列來表示迷宮

因為每乙個路口的四個方向相對於當前路口的位移都是一樣的,這樣可以用乙個int型別二位資料表示四個方向的相對於當前位置的位移,以順時針東、南,、西、北儲存

*///路口資料結構化

//當前路口狀態;1表示通順路口,2表示搜尋過的,0表示障礙路口

#include#include#define maxstacksize 72 //堆疊的最大元素個數

#define m 9 //表示迷宮的行

#define n 8 //表示迷宮的列

//初始化迷宮,用於遞迴求通路

int maze[m][n]=,

, ,, ,

, , ,

};//用於堆疊求通路

int mazee[m][n]=,

, ,, ,

, , ,

};//初始化每個路口相鄰路口的相對偏移量陣列,表示當前路口的四個方向,按順時針依次是東,南、西、北

int move[4][2]= ,,,};

//求迷宮通路演算法,兩個引數為入口座標

int maze(int x, int y)

int a,b;

int tag = 0;

//迷宮出口

if(x==8 && y==7)

return 1;

//試探相鄰的4個路口

for(int i= 0; i<4; i++)

}}//end for

return 0;}/*

第二部分使用堆疊求迷宮通路

*///路口資料化

typedef struct stack;

//棧用來儲存從入口到當前路口的路徑

typedef struct

seqstack;

//堆疊初始化

void stackinitiate(seqstack *s)

//判斷堆疊是否為空

int stacknotempty(seqstack s)

//入棧,成功返回1,否則返回0

int stackpush(seqstack *s,stack x)

else }

//取得棧頂元素,成功返回1,否則返回0

int stacktop(seqstack s,stack *x)

else

}//出棧,成功返回1,否則返回0

int stackpop(seqstack *s,stack *x)

else }

void getpass()//end if

}//end if

if(i==3)

}//end for

//迷宮出口

if(a==8&&b==7)break;     //但搜尋到出口跳出

}//end while

if(!stacknotempty(s))printf("該迷宮沒有通路\n");

else//end while

}//end else

}void main()

{//堆疊求迷宮通路

printf("堆疊求迷宮的通路:\n");

getpass();

printf("\n\n\n\n");

//遞迴求所有通路,按一定方向順序進行搜尋能得到一條路徑,反過來想的話,用不同方向順序進行搜尋能得到不同路徑,除非只有一條通路

//呼叫maze,每呼叫依次必須對迷宮進行初始化

printf("遞迴求迷宮的通路:\n");

maze(0,0);

//迷宮入口

printf("(0,0)←入口\n");

system("pause");

回溯法求解迷宮問題

題目 這是我在老師發的ppt上發現的一道題,如下 1表示起點 7表示終點,一共六個路口,每個路口可以通達最多左上右三個路口,不能走的方向用0表示,求從1到7的路徑。求解思路 每個路口最多有三個搜尋分支。把演算法設計為如下的搜尋過程 把整個搜尋分解為向左 向前和向右三個方向上子問題的搜尋。當搜尋到某個...

回溯法求解迷宮問題

最近在leetcode上看了些演算法題,有些看著很簡單的很常用的東西,竟然一下子想不出來怎麼求解,比如說 實現sqrt函式,求陣列的排列。如果高數學的不好,這些看似簡單的問題,第一次碰到也會感覺很難求解,當然了,今天要說的是這樣乙個問題,求解迷宮的所有解,這個問題的求解用到了回溯法的思想,不了解這個...

棧求解迷宮問題

問題 假設下圖1是某迷宮的地圖 0代表路徑,1代表牆壁 問此迷宮是否有條通路?求解思想 用棧來實現解決問題,主要步驟是 1 將迷宮的入口座標設為當前座標 2 將當前座標壓棧,將當前座標上的值設為2 0變為2 代表已走過的路 3 判斷當前座標的四周 上下左右 是否是可以通 為0則通 的,如果是通的,那...