題目
對於給定條件的迷宮,若只有一條出路,求出口,若有多條出路,求最短路徑!迷宮大概可分為三類:
思路對於迷宮問題,我們首先應該有回溯的思想:
回溯演算法實際上乙個嘗試搜尋的過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。在本題中也用到的就是回溯, 就是把走過的點座標壓棧,遇到無路可走的情況就開始回溯,也就是出棧!
思路:首先,將入口座標壓入棧中,確定棧頂元素入口座標為當前位置,並且將走過的座標標記,以免走回頭路。從當前位置開始探索上下左右四個方向,能通過則壓棧繼續切換當前位置前進,但是如果遇到死胡同(四個方向都不通),則回溯,既出棧一次,把棧頂座標當做是當前位置,繼續探索。探索過程中如果遇到終點,則直接結束;如果沒有終點,則會一直回溯到起點,這時棧一定為空。此時,迷宮沒有通路。參考**
//檢查當前位置是否可通
static int checkaccess(pos
next)
else
}//乙個入口,乙個出口,求一條通路(返回1有通路,返回0沒有通路)
int getmazepath(pos entry, pos
exit)
//上next = pcur;
next.row -= 1;
if (checkaccess(next))
//下next = pcur;
next.row += 1;
if (checkaccess(next))
//左next = pcur;
next.col -= 1;
if (checkaccess(next))
//右next = pcur;
next.col += 1;
if (checkaccess(next))
//當前座標不通,則出棧回溯,把上乙個結點當做當前位置繼續探索
stackpop(&s);
}}void test()
思路:在求解第一類迷宮的基礎上,當遇到乙個終點的時候,不要直接返回程式,而是繼續探索回溯,找到下乙個終點,繼續回溯。然後,設定乙個全域性的變數來記錄最短路徑的長度,第一次到達終點,把路徑長度賦值給全域性變數,在以後的回溯中遇到終點則比較,如果小於全域性變數的值,則更新。參考**
//檢查當前位置是否可通
static int checkaccess(pos pcur, pos
next)
else
}int getmazepath(pos entry)
//上next = pcur;
next.row -= 1;
if (checkaccess(pcur, next))
//下next = pcur;
next.row += 1;
if (checkaccess(pcur, next))
//左next = pcur;
next.col -= 1;
if (checkaccess(pcur, next))
//右next = pcur;
next.col += 1;
if (checkaccess(pcur, next))
//當前座標不通,則出棧回溯,把上乙個結點當做當前位置繼續探索
stackpop(&s);
}stackdestory(&s);
return shortpath;
}void test()
上邊的**雖然很好的求出來最小路徑,但是這個程式是有侷限性的,它值適用於對迷宮路徑中不帶環的通路進行求解,如果迷宮中的路徑是帶環的,這道題的解法就是錯誤的
思路換一種標記方式,從入口開始標記2,然後後邊標記的值依次比前面標記的值要大於1。既然標記方式被改變了,那麼回溯到前乙個座標時,再去檢查前乙個座標的下乙個位置是否可通的方法也就被改變了。參考**
//檢查當前位置是否可通
static int checkaccess(pos pcur,pos
next)
else
}//返回最短路徑
int getmazepath(pos entry)
//上next = pcur;
next.row -= 1;
if (checkaccess(pcur,next))
//下next = pcur;
next.row += 1;
if (checkaccess(pcur, next))
//左next = pcur;
next.col -= 1;
if (checkaccess(pcur, next))
//右next = pcur;
next.col += 1;
if (checkaccess(pcur, next))
//當前座標不通,則出棧回溯,把上乙個結點當做當前位置繼續探索
stackpop(&s);
}stackdestory(&s);
return shortpath;
}void printmaze()
printf("\n");
}printf("\n");
}void test()
結語夜空的璀璨,職位迎接更美好的明天!
資料結構之棧的應用 迷宮求解
程式設計思想 1 迷宮地圖相關 利用動態二維陣列來初步勾勒出迷宮 建議先用malloc申請一維陣列,再用calloc申請每個元素中的一維陣列,因為我用的是1來表示迷宮的通路,0表示死路,calloc申請完後就會自動初始化為0 迷宮交岔路結點 我們要有乙個掃瞄通路的函式,對乙個座標進行東南西北的掃瞄,...
《資料結構》 棧的應用 迷宮求解問題
利用棧求解迷宮問題 只輸出乙個解,演算法3.3 typedef struct 迷宮座標位置型別 postype define maxlength 25 設迷宮的最大行列為25 typedef int mazetype maxlength maxlength 迷宮陣列 行 列 全域性變數 mazety...
資料結構之 棧應用 老鼠迷宮問題
老鼠迷宮問題是棧應用問題的乙個入門,通過對滿足要求的迷宮位置壓棧,同時,將位置置為不可用,來實現對從迷宮入口到出口的路徑尋找 非最優路徑 下面是關鍵的 include mymatrix.cpp include include mystack array.cpp include pos.h void ...