Problem Description
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.<br><br>Note: the number of first circle should always be 1.<br><br><img src=../../data/images/1016-1.gif><br>
Input
n (0 < n < 20).<br>
Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.<br><br>You are to write a program that completes above process.<br><br>Print a blank line after each case.<br>
Sample Input
6<br>8<br>
Sample Output
Case 1:<br>1 4 3 2 5 6<br>1 6 5 2 3 4<br><br>Case 2:<br>1 2 3 8 5 6 7 4<br>1 2 5 8 3 4 7 6<br>1 4 7 6 5 8 3 2<br>1 6 7 4 3 8 5 2<br>
Source
Asia 1996, Shanghai (Mainland China)
简单题意:
一个由图组成的圆环,把自然数放在环中,两个临近的环的和是一个素数,并且第一个环的值总为1.现在需要编写一个程序,使得数字的顺序必须满足上述的要求。
解题思路形成过程:
Dfs更多的是表示一种状态,如果不成功,则回溯到上一个状态。由DFS算法可以很轻松地完成问题。
AC代码:
#include <iostream>
#include<cstdio>
#include<cmath>
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<cstdio>
#include<cmath>
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("");
}
}