码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1016 Prime Ring Problem

时间:2016-05-22 23:00:58      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

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)。

hdu 1016 Prime Ring Problem

标签:

原文地址:http://www.cnblogs.com/nefu929831238/p/5517921.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!