公众号:CppCoding
回朔法简介:
假设某问题的解决步骤可能有N步,且每一步的解决方法有M种,按照某种顺序依次试探每一步中的各种方法,一旦失败,就返回上一步继续其他的M-1种方法。简而言之就是,从一条路往前走,不能进则退回来,换一条路。
#include <vector>
#include <iostream>
using namespace std;
//把迷宫表示为n个有编码的路口
//定义路口类
class Crossing{
//路口的三个方向,0表示不通
int turn1;
int turn2;
int turn3;
public:
Crossing(int turn1,int turn2,int turn3){
turn1=turn1;
turn2=turn2;
turn3=turn3;
}
};
//定义迷宫类
class Maze{
private:
int exit;
//出口编码
vector<Crossing> crossing;
//路口集合
vector<int> result;
public:
Maze(int the_exit,vector<Crossing> the_crossing){
exit=the_exit;
crossing=the_crossing;
}
findExit(int entrance);//迷宫求解
getResult();//取得迷宫解并打印
};
//迷宫求解核心算法
Maze::findExit(int entrance){
if(entrance>0){
if(entrance==Maze::exit){
result.push_back(entrance);
return 1;
}
if(findExit(crossings[entrance].turn1)){
result.push_back(entrance);
return 1;
}
if(findExit(crossings[entrance].turn2)){
result.push_back(entrance);
return 1;
}
if(findExit(crossings[entrance].turn3)){
result.push_back(entrance);
return 1;
}
}
return 0;
}
Maze::getResult(){
findExit(1);
//传入路口1,若路口直接是想要得到的直接退出,否则就将路口的分支传入,得到通路的下一个路口,然后依次往下找到最后路口。
for(int i=result.size();i>0;i--){
cout<<result[i-1]<<"->";
}
cout <<"Exit" << endl;
}
int main(){
//创建一个迷宫9个路口,出口为10
Crossing c1(2,0,0);
Crossing c2(4,0,0);
Crossing c3(0,0,0);
Crossing c4(3,5,0);
Crossing c5(6,0,0);
Crossing c6(7,0,0);
Crossing c7(8,9,0);
Crossing c8(0,0,0);
Crossing c9(10,0,0);
Crossing c0(0,0,0);
vector<Crossing> crossings;
crossings.push_back(c0);
crossings.push_back(c1);
crossings.push_back(c2);
crossings.push_back(c3);
crossings.push_back(c4);
crossings.push_back(c5);
crossings.push_back(c6);
crossings.push_back(c7);
crossings.push_back(c8);
crossings.push_back(c9);
Maze newMaze(10,crossings);
newMaze.getResult();
return;
}