前言:这一个经典的问题,可以把问题转换成数据结构中的 图 来解决。本博客节选自我去年7月份的数据结构报告
问题描述
假设有 n 个修道士和 n 个野人准备渡河,但只有一条能容纳 c 人的小船,为了防止野人侵犯修道士,要求无论在何处,修道士的个数不得少于野人的人数(除非修道士个数为0)。如果两种人都会划船,试设计一个算法,确定他们能否渡过河去,若能,则给出一个小船来回次数最少的最佳方案。
解题思路
采用邻接表做为存储结构,将各种状态之间的迁移图保存下来
用一个三元组(x1, x2, x3)表示渡河过程中各个状态。其中,x1 表示起始岸上修道士个数, x2 表示起始岸上野人个数,x3 表示小船位置(0——在目的岸,1——在起始岸)。例如 (2,1,1)表示起始岸上有两个修道士,一个野人,小船在起始岸一边
用一个二元组(x1, x2)表示一个小船的状态,x1表示修道士人数,x2表示野人数量。x1 ≥ x2;或者 x1=0, x2=任意数
应用广度优先搜索来查找最优解
输出所有的最优解。可能不存在,也可能有很多最优解
样例输入输出
输入样例:
起始岸上有多少个传教士或野人?