题目要求:将1,2,3,…,20这20个数围成一圈,使相邻的两数之和均为素数。
思考:
这样的环显然不止一种,如果要输出所有环,那么就要按照一定顺序,一定原则来输出。
为了方便思考,不妨就假设第一个元素为1,能与1相邻且和为素数的有2,4,10,12,16;
如果将2放置在1之后,紧接着要寻找能与2相邻且和为素数的数,这与前面的步骤相仿,显然可以用递归来实现,而且这种逻辑与图的深度优先遍历不谋而合。
假如1,2的顺序已经遍历完了,那么紧接着要遍历1,4,这就要想到2遍历完之后要回到起点1,这就是回溯的思想了。
因此核心思想就是递归,回溯。
/*
将1,2,3,...,20这20个数围成一圈,使相邻的两数之和均为素数。
PS:以下代码只是20个数的情况,稍加修改即可达到自由输入数的个数。
*/
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
int p[41]={
0};//下表代表数,内容1代表是素数,0代表不是素数
int n[20]={
0};//存放1-20
int vis[21]={
0};//表示n中存放的数是否被访问过
void Init_p