素数环—回溯法
问题介绍
给定数字 n ,排列从 1 到 n 的数字成环,使得相邻的俩数字之和为素数(质数)
问题分析
本文引入此问题是为了讲解下回溯法。介绍下回溯法:
大家应该知道迷宫,在走迷宫的时候选定一条道路,走不通回来继续走,走不通回来继续走… 回溯法类似,回溯嘛,就是走不对回来换条路呗,直到找到合适的问题解决方案。
再到本问题来,分析下数据结构,环嘛,就是线性的,所以用个一维数组存放环即可,在此定义环数组为 home,大小为 n 。对于一个环,要有一个起点,但是起点是哪个数字无所谓,在此初始化数组第一个元素
为 1 。另外需要另一个数组保存给定的数字的集合,所以定义该数组为 arr ,大小
为 n。上面讲到,已经初始化化环的第一个元素,所以就从该元素开始。逻辑部分如下:
取得环的当前最后一个元素 lastNumber,遍历数组 arr ,若遍历过程中当前数字
不存在于 home 数组中 且 当前数字与 lastNumber 和为质数,则将该数字添加
到环的末尾,准确说是指定下标的位置。到环的长度等于 n 时,便是一种解决方案。
代码实例(C语言)
#inclu