HDU 1016 Prime Ring Problem【第一次DFS的邂逅】
2015-08-16 12:26
375 查看
Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 34498 Accepted Submission(s): 15267
[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.
Note: the number of first circle should always be 1.
[align=left]Input[/align]
n (0 < n < 20).
[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.
You are to write a program that completes above process.
Print a blank line after each case.
[align=left]Sample Input[/align]
6 8
[align=left]Sample Output[/align]
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
[align=left]Source[/align]
Asia 1996, Shanghai (Mainland China)
注意:
1:在fun函数里面的i不可以用作全局变量 因为DFS的递归(函数调用)会影响i的值 所以i只能在fun函数里面定义(PS:除非i在递归中没有数值的影响)
2:深搜的模板(自己编的)
void fun(int a) { if()/*剪枝的条件*/ { ; } if()/*非法情况的条件*/ { ; } if()/*最深层递归的跳出条件*/ { ; } if()/*继续递归条件*/ { vis[i]=false;/*深搜如果不能返回前一个*/ fun(num);/*递归调用*/ vis[i]=true;/*返回递归的一个退出条件*/ } }
代码如下:
#include<stdio.h> #include<string.h> #include<stdbool.h> int n; bool vis[25]; int num[25]; bool fun(int s) { for(int i=2; i*i<=s; i++) { if(s%i==0) return false; } return true; } void Dfs(int s,int t)//s第t-1个数的值 t要搜索第t个数 { if(t==n+1)//跳出的条件 { if(fun(s+1)==true) { for(int i=1; i<n; i++) { printf("%d ",num[i]); } printf("%d\n",num ); } return ; } for(int i=1; i<=n; i++)//递归调用 { if(vis[i]==false)//判断是否重复出现 { if(fun(i+s)==true) { num[t]=i; vis[i]=true; Dfs(i,t+1); vis[i]=false;//进入到最深层后,返回时用到 } } } } int main() { int Case=0; while(~scanf("%d",&n)) { printf("Case %d:\n",++Case); memset(vis,0,sizeof(vis)); vis[1]=true;//确定这个数字使用过 num[1]=1;//输出的数字 Dfs(1,2); printf("\n"); } return 0; }
相关文章推荐
- HDU 5384 Danganronpa (字典树运用)
- 次元门公共交通系统
- 阻塞/非阻塞读写总结、tcp网络编程的本质、muduo::Buffer设计简介
- NYOJ 613 免费馅饼
- vs2013 密钥
- Android - 电池状态
- Leetcode问题-2(Add Two Numbers)
- Java基本排序算法
- 500 OOPS: cannot change directory:/root
- 绝对定位之类的
- Unsupported major.minor version 51.0 myeclipse2013 2014 同时用
- Spring使用HibernateDaoSupport操作数据
- C++基础---引用
- 数据库类型对应java类型汇总(mysql、sql server和oracle)
- POJ 1836 Alignment
- PHP连接Nginx服务器并解析Nginx日志的方法
- centos 7 图形界面 文本界面切换
- 排序算法小结
- 二叉查找(排序)树的分析与实现
- 工厂方法模式