一、题目编号:
1020
二、简单题意:
给出N,求所有由1-N组成的首位为1环形序列,要求相邻两数的和为素数。
1020
二、简单题意:
给出N,求所有由1-N组成的首位为1环形序列,要求相邻两数的和为素数。
三、解题思路形成过程
这道题非常类似于N皇后问题,使用的是深度优先搜索方法。按照从小到大的搜索顺序搜索后的结果就是符合输出顺序的。
这道题非常类似于N皇后问题,使用的是深度优先搜索方法。按照从小到大的搜索顺序搜索后的结果就是符合输出顺序的。
四、感想
要注意细节问题,空格空行需要谨慎。
要注意细节问题,空格空行需要谨慎。
五、AC代码
#include<stdio.h>
#include<math.h>
int a[25];
bool use[25];
int n;
bool isprime(int num){
int i;
for(i=2;i<=sqrt(num+0.0);i++){
if(num%i==0)
return false;
}
return true;
}
#include<math.h>
int a[25];
bool use[25];
int n;
bool isprime(int num){
int i;
for(i=2;i<=sqrt(num+0.0);i++){
if(num%i==0)
return false;
}
return true;
}
void DFS(int num){
int i;
if(n==num&&isprime(1+a[n-1])){
for(i=0;i<n;i++){
printf(i==n-1?"%d\n":"%d ",a[i]);
}
}
else{
for(i=2;i<=n;i++){
if(!use[i]&&isprime(i+a[num-1])){
a[num]=i;
use[i]=true;
DFS(num+1);
use[i]=false;
}
}
}
}
int i;
if(n==num&&isprime(1+a[n-1])){
for(i=0;i<n;i++){
printf(i==n-1?"%d\n":"%d ",a[i]);
}
}
else{
for(i=2;i<=n;i++){
if(!use[i]&&isprime(i+a[num-1])){
a[num]=i;
use[i]=true;
DFS(num+1);
use[i]=false;
}
}
}
}
void init(){
int i;
for(i=0;i<n;i++){
use[i]=false;
}
a[0]=1;
}
int main(){
int t=0;
while(scanf("%d",&n)!=EOF){
init();
printf("Case %d:\n",++t);
DFS(1);
puts("");
}
}
int i;
for(i=0;i<n;i++){
use[i]=false;
}
a[0]=1;
}
int main(){
int t=0;
while(scanf("%d",&n)!=EOF){
init();
printf("Case %d:\n",++t);
DFS(1);
puts("");
}
}