您的位置:首页 > 其它

回溯法-素数环

2016-03-20 10:43 381 查看
输入正整数n,把整数1,2,3,……,n组成一个环,使得相邻的两个整数之和均为素数。

采用深度优先遍历解答树的方法。这里用RINGLENGTH代替了n,由于要求每个数只能使用一次,需要有个vis[]来记录是否被使用过。

#include<stdio.h>
#include<math.h>
#define RINGLENGTH 10
int isp[100];
int a[12];
int vis[12];
bool isPrime(int num)
{
int s = (int)sqrt(num);			//注意类型转换时精度的损失
int i;
for(i = 2; i <= s; i++)
if(!(num % i))	break;
return (i > s ? 1 : 0);
}
void initPrime()
{
for(int i = 2; i < 100; i++)
isp[i] = isPrime(i);
}
void dfs(int cur)
{
int i, j;
if( cur == RINGLENGTH && isp[a[RINGLENGTH - 1] + a[0]])
{
for(i = 0; i < RINGLENGTH; i++)
printf("%d ", a[i]);
printf("\n");
}
else
for(j = 1; j <= RINGLENGTH; j++)
{
if(!vis[j] && cur == 0)
{
vis[j] = 1;
a[0] = j;
dfs(cur + 1);
vis[j] = 0;	//注意标志位复原
}
else if(!vis[j] && isp[a[cur - 1] + j])
{
vis[j] = 1;
a[cur] = j;
dfs(cur + 1);
vis[j] = 0;	//注意标志位复原
}
}
}
int main()
{
int cur = 0;
initPrime();
dfs(cur);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: