回溯法求解迷宮問題
阿新 • • 發佈:2018-10-06
回溯 路徑 style 通路 完全 continue != std 下一個 using namespace std;
int ro[100];//記錄走過的路徑
int k=-1;//路口數目
int flag=1;
int road(int a[][3],int m){
k++;//沒經過一樂路口k就加1
for(int i=0;i<3;i++){
if(flag==0){//遇到終點結束
break;
}
if(a[m][i]==7){//找到終點輸出走過的路徑
cout <<"存在出口在"<<m +1<<"行"<<i+1<<"列" << endl;
cout<<"路徑為" << "1" <<" ";
for(int s=0;s<k;s++){
cout <<ro[s]+1 << " " ;
}
flag=0;//表示探索結束
}
if(a[m][i]!=0){//探索路徑
ro[k]=a[m][i]-1;
road(a,ro[k]);//遞歸下一個路口
}
else{
continue;//遇到0即沒有路了跳過
}
}
k--;//該條路徑不行,回溯到前一個路口
return 1;
}
int main()
{
int a[6][3];
for(int i=0;i<6;i++){
for(int j=0;j<3;j++){
cin >> a[i][j];
}
}
road(a,0);
return 0;
}
題目
這是我在老師發的PPT上發現的一道題,如下
1表示起點 7表示終點,一共六個路口,每個路口可以通達最多左上右三個路口,不能走的方向用0表示,求從1到7的路徑。
求解思路:每個路口最多有三個搜索分支。把算法設計為如下的搜索過程:把整個搜索分解為向左、向前和向右三個方向上子問題的搜索。
當搜索到某個路口,發現該路口沒有可搜索的方向時,就讓搜索過程回溯到該路口的前一個路口,然後搜索這個路口的其他尚未搜索過的搜索方向。
樣的搜索過程一直繼續到找到出口或搜索完全部可連通路口的所有可能搜索方向沒有找到出口為止。
代碼:
#include <bits/stdc++.h>
int ro[100];//記錄走過的路徑
int k=-1;//路口數目
int flag=1;
int road(int a[][3],int m){
k++;//沒經過一樂路口k就加1
for(int i=0;i<3;i++){
if(flag==0){//遇到終點結束
break;
}
if(a[m][i]==7){//找到終點輸出走過的路徑
cout <<"存在出口在"<<m +1<<"行"<<i+1<<"列" << endl;
for(int s=0;s<k;s++){
cout <<ro[s]+1 << " " ;
}
flag=0;//表示探索結束
}
if(a[m][i]!=0){//探索路徑
ro[k]=a[m][i]-1;
road(a,ro[k]);//遞歸下一個路口
}
else{
continue;//遇到0即沒有路了跳過
}
k--;//該條路徑不行,回溯到前一個路口
return 1;
}
int main()
{
int a[6][3];
for(int i=0;i<6;i++){
for(int j=0;j<3;j++){
cin >> a[i][j];
}
}
road(a,0);
return 0;
}
總結:該代碼以PPT上的迷宮而寫的,只需改一下參數便可以輕易擴展到一般的情況。
回溯法求解迷宮問題