hdu1016枚举递归-经典DFS-简单回溯入门
2016-03-06 16:33
393 查看
1)注意格式要求(@1234);先顺时针输出再逆时针输出并不用存储所有可能再倒着输出一遍,因为逆时针的输出被包含在前者之中,这里我应该是没读懂题意;之前在想怎么运行完一次之后或者找不到之后如何退回到上一步,是不是要return什么啊之类的,其实执行完递归就自动退回了,如果符合边界条件就输出,不符合就继续执行,然后自动退回到上一层,在上一层这个递归语句之后只是需要将相应的“标记数组”之类的,或者cur当前所指,减一即可,回溯的真谛、dfs的真谛,还是理解不透彻;另外需要递归时,确定递归函数参数,然后在递归函数里写两个分支,即if{};(//边界条件)else{};即可。
2)
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 38645 Accepted Submission(s): 17074
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.
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
Source
Asia 1996, Shanghai (Mainland China)
#include <iostream> #include <math.h> #include <string.h> using namespace std; int n;int g; int kase; int bj[23]={0}; int jg[23]; //int jilu[23][23]; int pri[41];//={1},youxiao ma void dfs(int cur) { if(cur==n&&pri[jg[n-1]+jg[0]]){ for(int i=0;i<n-1;i++){ cout<<jg[i]<<" ";//@2 } cout<<jg[n-1]<<endl;//@3 //memcpy(&jg,&jilu[g++],sizeof(jg)); } else{ for(int i=2;i<=n;i++){ if(!bj[i]&&pri[jg[cur-1]+i]){ bj[i]=1; jg[cur]=i; dfs(cur+1);//不用cur++,则从这递归完成出来以后也不用cur--; bj[i]=0; } } } } bool is_pri(int k){ for(int i=2;i<=sqrt(k);i++){ if(k%i==0){ return 0; } } return 1; } int main() { //素数提前打表,提高速度 for(int i=2;i<=40;i++){ if(is_pri(i)) pri[i]=1; } kase=0; while(cin>>n){ printf("Case %d:\n",++kase);//@1 jg[0]=1; dfs(1); cout<<endl;//@4 //prin(); } }
2)
Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 38645 Accepted Submission(s): 17074
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.
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
Source
Asia 1996, Shanghai (Mainland China)
相关文章推荐
- Windows服务器上使用bat定时执行php
- 错误svn: The repository at 'svn://xxxxx' has uuid 'XXXX', but the WC has 'XXXX'“
- 构建之法:略读
- poj 1700 Crossing River
- 自我介绍
- demo07
- 第一天
- java设计优化之单例模式
- 一步一步学ROP之Android ARM 32位篇
- Linux进程时间片的分配(调度策略和参数)
- 实现自动生成30道四则运算题目
- 3.3
- 3月6号
- 数据范围
- Android架构__MVP
- JAVA SAX(流读取方式) 读取xml文档 简单列子
- Android检测IBeacon热点
- BZOJ-3576 江南乐 博弈+优化
- BZOJ-3576 江南乐 博弈+优化
- 3.2