第一次寫,見諒
以下是求迷宮的實現
為什麼下面會出現標籤啊,有什麼簡便的方法去掉嗎?求告知
最後是關於求所有通路,個人愚笨只想到改變搜尋方向順序這種笨方法,總共有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則通 的,如果是通的,那...