newoj墓地2908: 素数环PrimeRing 深搜

题目描述
把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;
}

你可能感兴趣的:(newoj墓地2908: 素数环PrimeRing 深搜)