2016ACM暑假集训 - Prime Ring Problem
2016-07-22 23:46
246 查看
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.
Note: the number of first circle should always be 1.
Input
n (0 < n < 20).
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.
You are to write a program that completes above process.
Print a blank line after each case.
Sample Input
Sample Output
解题思路:深度优先搜索,固定第一个为1,后面的为2-n,如果不符合条件救回溯。另外用一个数组储存是否是素数,加快速度
代码:
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.
Note: the number of first circle should always be 1.
Input
n (0 < n < 20).
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.
You are to write a program that completes above process.
Print a blank line after each case.
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
解题思路:深度优先搜索,固定第一个为1,后面的为2-n,如果不符合条件救回溯。另外用一个数组储存是否是素数,加快速度
代码:
#include <cstdio> #include <cmath> #include <cstring> int a[25]; bool use[25]; int n; bool p[] = {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}; void DFS(int num) { if(n == num && p[1+a[n-1]]) { for(int i = 0; i < n; i++) { printf(i == n-1 ? "%d\n" : "%d ", a[i]); } } else { for(int i = 2; i <= n; i++) { if(!use[i] && p[i+a[num-1]]) { a[num] = i; use[i] = true; DFS(num+1); use[i] = false; } } } } int main() { int t = 0; while(scanf("%d",&n) != EOF) { memset(use, 0, sizeof(use)); a[0] = 1; t++; printf("Case %d:\n", t); DFS(1); puts(""); } return 0; }
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- 矩阵的乘法操作
- C 语言实现迷宫 DFS算法