您的位置:首页 > 编程语言 > C语言/C++

c语言素数环问题(回溯)

2017-10-31 20:24 393 查看

Problem F

素数环问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

把1到20这重新排列,使得排列后的序列A满足:

a. 任意相邻两个数之和是素数

b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的第k+1项小。(即按字典序排列的第一项)
输入:

没有输入。

输出:

输出A,两个数字之间用一个空格隔开,第一个数字前面和最后一个数字后面没有空格。

输入样例:


输出样例:

#include<stdio.h>

#include<stdlib.h>

int a[21],sum=0;

int isprime(int m)

{

    for(int i=2;i*i<=m;i++)

        if(m%i==0)    return 0;

    return 1;

}

void output()

{    sum++;

      if(sum==2)

      { 
   for(int i=1;i<=20;i++)

        if(i==1)printf("%d",a[i]);

        else     printf(" %d",a[i]);

        printf("\n");

        exit(0);

    }

}

void swap(int m,int i)

{

    int t;

    t=a[m];

    a[m]=a[i];

    a[i]=t;

}    

void search(int m)//2,3,4...20,21

{

    if(m>20)

    {    

    if(isprime(a[20]+a[1]))
   output();

    }

    else

    {    for(int i=m;i<=20;i++)//只能和后面的数交换,而不能和前面的数交换

        {

            swap(m,i);

            if(isprime(a[m-1]+a[m]))

                search(m+1);

            swap(m,i);

        }

    }

}

int main()

{

    for(int i=1;i<=20;i++)

        a[i]=i;

    search(2);

    return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 回溯 质数