1020Prime Ring Problem
2016-04-24 17:11
447 查看
[align=left]Problem Description[/align]
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>
[align=left]Input[/align]
n (0 < n < 20).<br>
[align=left]Output[/align]
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>
[align=left]Sample Input[/align]
6<br>8<br>
[align=left]Sample Output[/align]
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>
[align=left]Source[/align]
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;
}
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;
}
}
}
}
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("");
}
}
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>
[align=left]Input[/align]
n (0 < n < 20).<br>
[align=left]Output[/align]
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>
[align=left]Sample Input[/align]
6<br>8<br>
[align=left]Sample Output[/align]
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>
[align=left]Source[/align]
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;
}
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;
}
}
}
}
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("");
}
}
相关文章推荐
- CodeForces 1A-Theatre Square【数学】
- MAC地址
- java ArrayList集合分析
- 第 20 章 项目实战--首页内容介绍[下][4]
- static 静态成员函数
- 安装SQL2008的时候 出现System.Configuration.ConfigurationErrorsException: 创建 userSettings/Microsoft.SqlServe
- 商业研究(12):下厨房,美食菜谱分享社区及新型电商,唯有美食与爱不可辜负
- 商业研究(12):下厨房,美食菜谱分享社区及新型电商,唯有美食与爱不可辜负
- Java NIO系列教程(10):DatagramChannel
- python中字符串加r
- 商业研究(12):下厨房,美食菜谱分享社区及新型电商,唯有美食与爱不可辜负
- 深度学习(三十七)LSTM、GRU网络入门学习-未完待续
- linux内核分析(网课期末&地面课期中)
- QT学习笔记----解决QT无法显示汉字问题
- java对象排序
- 数据库学习(1)--索引Index
- Java NIO系列教程(9):ServerSocketChannel
- 不完全node实践教程-第六发
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个
- ACM--字符串--CSU--1550-- Simple String