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
//第二道深搜题,原谅我是照大神代码抄的。。还是有些不理解。。。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int prime[50],data[50],visit[50]; int n; void getprime() { memset(prime,0,sizeof(prime)); prime[1]=1; for(int i=2;i<50;i++) { if(!prime[i]) { for(int j=i+i;j<50;j+=i) prime[j]=1; } } } void dfs(int step) { if(step==n+1&&!prime[data[1]+data[n]]) { for(int i=1;i<n;i++) cout<<data[i]<<" "; cout<<data[n]<<endl; return ; } for(int i=2;i<=n;i++) { if(!visit[i]&&!prime[i+data[step-1]]) { data[step]=i; visit[i]=1; dfs(step+1); visit[i]=0; } } } int main() { getprime(); int cnt=0; while(cin>>n) { cnt++; printf("Case %d:\n",cnt); memset(visit,0,sizeof(visit)); data[1]=1; dfs(2); cout<<endl; } return 0; }
附深搜与广搜的区别
一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是"搜到就是最优解", 而深搜用于找多个解或者是"步数已知(好比3步就必需达到前提)"的标题,它的空间效率高,然则找到的不必定是最优解,必需记实并完成全数搜索,故一般情况下,深搜需要很是高效的剪枝(优化).
像搜索最短路径这些的很显著若是用广搜,因为广搜的特征就是一层一层往下搜的,保证当前搜到的都是最优解,当然,最短路径只是一方面的操作,像什么起码状态转换也是可以操作的。
深搜就是优先搜索一棵子树,然后是另一棵,它和广搜对比,有着内存需要相对较少的所长,八皇后标题就是典范楷模的操作,这类标题很显著是不能用广搜往解决的。或者像图论里面的找圈的算法,数的前序中序后序遍历等,都是深搜
深搜和广搜的分歧之处是在于搜索次序的分歧。
深搜的实现近似于栈,每次选择栈顶元素往扩年夜,
广搜则是操作了队列,先被扩年夜的的节点优先拿往扩年夜。
搜索树的形态:深搜层数良多,广搜则是很宽。
深搜合适找出所有方案,广搜则用来找出最佳方案
深搜和广搜的分歧:
深搜并不能保证第一次碰着方针点就是最短路径,是以要搜索所有可能的路径,是以要回溯,标识表记标帜做了之后还要打消失踪,是以统一个点可能被访谒良多良多次。而广搜因为它的由近及远的结点扩年夜次序,结点老是以最短路径被访谒。一个结点假如第二次被访谒,第二次的路径确定不会比第一次的短,是以就没有需要再从这个结点向周围扩年夜――第一次访谒这个结点的时辰已经扩年夜过了,第二次再扩年夜只会获得更差的解。是以做过的标识表记标帜不必往失踪。是以统一个点至多只可能被访谒一次。每访谒一个结点,与它相连的边就被搜检一次。是以最坏情况下,所有边都被搜检一次,是以时刻复杂度为O(E)。