描述:
把1到20这重新排列,使得排列后的序列A满足:
a. 任意相邻两个数之和是素数
b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的第k+1项小。(即按字典序排列的第一项)
输入:
没有输入。
输出:
输出A,两个数字之间用一个空格隔开,第一个数字前面和最后一个数字后面没有空格。
题解:
只打印字典序最小的一项即可。逐个数判断能否与我们放好的前一个数相加为素数,若不是素数,则回溯;若是,继续搜索。找到满足条件的第一个解即可。
代码:
#include <iostream> #include <string.h> #include <stdio.h> #include <math.h> using namespace std; int num[22]; bool used[22]; int couse=1; bool check(int x,int y) { int k=2,i=x+y; while(k<=sqrt(i)&&i%k!=0) k++; if(k>sqrt(i)) return true; return false; } void print() { printf("%d",num[1]); for(int i=2;i<=20;i++) printf(" %d",num[i]); printf(" "); } void Search(int x) { for(int i=1;i<=20;i++) { if(!used[i]&&check(num[x-1],i)&&couse==1) { num[x]=i; used[i]=true; if(x==20&&check(num[1],num[20])&&couse==1) {print();couse++;return ;} Search(x+1); used[i]=false; } } } int main() { Search(1); return 0; }