UVA 524 / hdu 1016 Prime Ring Problem
2016-02-17 14:41
204 查看
杭电链接:点击打开链接
Prime Ring Problem
A ring is composed of n (even number) circles as shown in diagram. Put natural numbers
into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
You are to write a program that completes above process.
题解:用深搜一个个搜索,题目规定是从1 开始,所以由1开始,在1----n-1个数时只需要两个相邻的数之和为素数,重点就在最后一个数,要考虑它和上一个数之和是否
是素数,还要考虑它和1 之和是否是素数,两者都符合的就可以组成一个素数环啦。
代码展示:
#include<iostream>
#include<cstring>
using namespace std;
int prim[40] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1};
int sign[22],flag[22];
int n;
void dfs(int s)
{
int i;
if(s > n) return;
if(s == n)
{
for(i = 0;i < n-1;i++)
cout<<flag[i]<<" ";
cout<<flag[n-1]<<endl;
return;
}
for(i = 2;i <= n;i++)
{
if(sign[i] == 1) continue;
if(s+1 == n)
{
if(prim[i+1] == 1 && prim[flag[s-1] + i] == 1)
{
flag[s] = i;
sign[i] = 1;
dfs(s+1);
sign[i] = 0;
}
}
else
{
if(prim[i+flag[s-1]] == 1)
{
flag[s] = i;
sign[i] = 1;
dfs(s+1);
sign[i] = 0;
}
}
}
return;
}
int main()
{
int m = 1;
while(cin>>n)
{
if(m > 1) cout<<endl;
memset(sign,0,sizeof(sign));
memset(flag,0,sizeof(flag));
sign[0] = 1;
flag[0] = 1;
cout<<"Case "<<m++<<":"<<endl;
dfs(1);
}
return 0;
}
Prime Ring Problem
A ring is composed of n (even number) circles as shown in diagram. Put natural numbers
into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
Input
n (0 < n <= 16)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.You are to write a program that completes above process.
Sample Input
6 8
Sample Output
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 题意:给n个数,把1到n组成一个如上图所示的素数环:顾名思义,就是在该环中,任意两个相邻的数之和为素数
题解:用深搜一个个搜索,题目规定是从1 开始,所以由1开始,在1----n-1个数时只需要两个相邻的数之和为素数,重点就在最后一个数,要考虑它和上一个数之和是否
是素数,还要考虑它和1 之和是否是素数,两者都符合的就可以组成一个素数环啦。
代码展示:
#include<iostream>
#include<cstring>
using namespace std;
int prim[40] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1};
int sign[22],flag[22];
int n;
void dfs(int s)
{
int i;
if(s > n) return;
if(s == n)
{
for(i = 0;i < n-1;i++)
cout<<flag[i]<<" ";
cout<<flag[n-1]<<endl;
return;
}
for(i = 2;i <= n;i++)
{
if(sign[i] == 1) continue;
if(s+1 == n)
{
if(prim[i+1] == 1 && prim[flag[s-1] + i] == 1)
{
flag[s] = i;
sign[i] = 1;
dfs(s+1);
sign[i] = 0;
}
}
else
{
if(prim[i+flag[s-1]] == 1)
{
flag[s] = i;
sign[i] = 1;
dfs(s+1);
sign[i] = 0;
}
}
}
return;
}
int main()
{
int m = 1;
while(cin>>n)
{
if(m > 1) cout<<endl;
memset(sign,0,sizeof(sign));
memset(flag,0,sizeof(flag));
sign[0] = 1;
flag[0] = 1;
cout<<"Case "<<m++<<":"<<endl;
dfs(1);
}
return 0;
}
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again