Description
Note: the number of first circle should always be 1.
Input
Output
You are to write a program that completes above process.
Print a blank line after each case.
Sample Input
Sample Output
1 6 7 4 3 8 5 2
題解:前一個和當前個相加是否是素數,是素數就輸出,就是按相鄰相加是否素數,最後一個就和第一個判斷。一定是偶數個輸出。
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
int n;
int pic[22];
bool vis[22];
bool isprime(int num){
int up = floor(sqrt(num)+0.5);
for(int i = 2; i <= up;i++)
if(num%i == 0) return false;
return true;
}
void init(){
memset(vis,false,sizeof(vis));
vis[1] = true;
pic[1] = 1;
}
void dfs(int num){
if(num == n && isprime(pic[1]+pic[n])){
for(int i = 1; i <= n-1; i++)
cout<<pic[i]<<" ";
cout<<pic[n]<<endl;
}else{
for(int i = 2; i <= n; i++){
if(!vis[i] && isprime(i+pic[num])){
vis[i] = true;
pic[num+1] = i;
dfs(num+1);
vis[i] = false;
}
}
}
}
int main(){
int c = 0;
while(cin>>n){
cout<<"Case "<<++c<<":"<<endl;
init();
dfs(1);
cout<<endl;
}
return 0;
}