Problem D
素数环问题
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
把1到20这重新排列,使得排列后的序列A满足:
a. 任意相邻两个数之和是素数
b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的第k+1项小。(即按字典序排列的第一项)
输入:
没有输入。
输出:
输出A,两个数字之间用一个空格隔开,第一个数字前面和最后一个数字后面没有空格。
输入样例:
输出样例:
来源:
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
int a[20];
int sum = 0;
bool isPrime(int k)
{
if(k < 2) return false;
for (int i = 2; i <= sqrt(k); ++i)
{
if(k % i == 0)
{
return false;
}
}
return true;
}
void display()
{
sum ++;
if(sum == 2)
{
for (int i = 0; i < 19; ++i)
{
cout<<a[i]<<" ";
}
cout<<a[19]<<endl;
exit(0); //输出即结束,去掉exit(0)和上面的if即可输出全部素数环
}
}
void dfs(int k)
{
if(k == 20 && isPrime(a[19] + a[0]))
{
display();
}
else
{
for (int i = k; i < 20; ++i)
{
swap(a[k],a[i]);
if(isPrime(a[k] + a[k-1]))
{
dfs(k+1);
}
swap(a[k],a[i]);
}
}
}
int main(int argc, char const *argv[])
{
for (int i = 0; i < 20; ++i)
{
a[i] = i + 1;
}
dfs(1);
return 0;
}