题目描述
把1~N这N个整数摆成一个环,要求任意相邻两个数的和为素数。按字典序打印出以1开始的素数环
Input
一个整数N (<=10)
Output
每行一个素数环。每个数之间用一个空格隔开。
无解输出 No Solution
Sample Input
【样例输入1】
4
【样例输入2】
3
Sample Output
【样例输出1】
1 2 3 4
1 4 3 2
【样例输出2】
No Solution
Hint
为什么只要求以1开始的解。只有以1开始会漏掉其他可能的解吗?
优化:思考有哪些操作是不断要重复进行的,怎么优化。如何提高剪枝效率。
#include"stdio.h"
#include"math.h"
#define N 11
void circle(int m);
int IsPrime(int m);
int ans[N];
int use[N];
int n;
int flag;
int main()
{
scanf("%d",&n);
ans[1] = 1;
use[1] = 1;//1为已经使用过
circle(2);
if(flag == 0)
printf("No Solution");
return 0;
}
void circle(int m)
{
int j, k;
if(m == n+1)//有结果
{
flag = 1;
for(j = 1; j<= n; j++)
{
printf("%d ",ans[j]);
}
printf("\n");
return ;
}
for(k = 2; k<=n; k++)
{
if(use[k]== 0 && IsPrime(k + ans[m-1]))//在满足可以使用同时与前一个ans[m-1]和为素数的情况下,再判断是否是最后一个,单独判断下是否与1的和也是素数
{
if(m == n && !IsPrime(k+1))
continue;
use[k] = 1;
ans[m] = k;
circle(m+1);
use[k] = 0;//在一条路不满足条件退出来后,要将沿途置一的数重新置0,否则其余的路径不能使用
}
}
}
int IsPrime(int m)
{
int q;
for(q = 2; q<=sqrt(m); q++ )
{
if(m%q == 0)
return 0;
}
return 1;
}