递归回朔法:迷宫问题

公众号: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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值