HDU1016 DFS

                          Prime Ring Problem

                              Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
                                                Total Submission(s): 14601 Accepted Submission(s): 6667

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)

Recommend

JGShining

 

题解:典型DFS 做法已经标记在 程序上了

 

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

int n,ans[22];
bool isp[45];
bool vis[45];
void dfs(int p,int x)   //p为当前第几个可行数 x为可行的数
{
    ans[p]=x;
    vis[x]=1;
    if(p==n)             //当P等于n证明最后一个数与倒数第二个数相加为素数 只需判断是否跟1相加为素数
    {
        if(isp[ans[p]+1]) //判断最后一个数是否与1相加为素数 如果是那么该环成立 输出结果
        {
            for(int i=1; i<=n; i++)
            {
                printf("%d",ans[i]);
                if(i<n)
                    printf(" ");
                else
                    printf("\n");
            }
            return ;
        }
    }
    for(int i=1; i<=n; i++)
    {
        if(!vis[i]&&isp[ans[p]+i])
        {
            dfs(p+1,i);//符合值进入下一层搜索
            vis[i]=0;  //不符合 回溯上一层
        }
    }
    return ;
}

int main()
{
    int s=1;
    memset(isp,1,sizeof(isp));
    isp[1]=0;
    isp[0]=0;
    for(int i=2; i<=int(sqrt(40)); i++)//打出素数表
    {
        if(isp[i])
        {
            for(int j=2*i; j<=40; j+=i)
                isp[j]=0;
        }
    }
    while(scanf("%d",&n)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        cout<<"Case "<<s<<':'<<endl;
        dfs(1,1);
        s++;
        cout<<endl;
    }

    return 0;
}
时间: 2024-10-29 13:35:17

HDU1016 DFS的相关文章

初试DFS之HDU1016

DFS和BFS是基础算法,可怜我现在才开始接触,不争气...... DFS入门题之HDU1016 提交7次才AC,前期四次超时,后期两次格式错误. 先贴上AC代码: #include<iostream> using namespace std; int a[25],book[25],n,Case=1; bool IsPrime[40]= {false,true,true,true,false,true,false,true,false,false,false,true,false,true,f

uva 10422 - Knights in FEN ID+dfs

10422 - Knights in FEN        经典的棋盘类问题,移动骑士到达指定状态,最少要几次,如果超过10次则输出Unsolvable in less than 11 move(s).        一开始想bfs的,但是状态量比较大,又懒得写hash,又想到了最坏情况,也就是超出10次时,dfs和bfs复杂度都一样,于是就果断用了ID+dfs,编程难度非常低.      不用加剪枝就可以过了,我的代码里加了个最优下限,这样不用每次从0开始进行ID,刚有想到可以利用当前最优情况

hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色)

/************************************************************************* > File Name: j.cpp > Author: HJZ > Mail: 2570230521@qq.com > Created Time: 2014年08月28日 星期四 12时26分13秒 *******************************************************************

迷宫求解非递归 DFS BFS(应用栈和队列)

栈和队列的应用对迷宫问题求解 没有递归 自己手动建的栈和队 并且输出路径 DFS的路径就是 栈中的坐标 BFS的路径在队又开了一个域存上一层的base值 语言还是用的C++ 感觉比C的封装性好很多 充分体会了一下DFS一边比BFS快 但是BFS是最优解而DFS可能不是最优解   #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace

如何实现图的BFS和DFS

图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS),因此不再对图的基本概念做过多的介绍,但是要先大致了解下图的几种常见的存储结构. 邻接矩阵 邻接矩阵既可以用来存储无向图,也可以用来存储有向图.该结构实际上就是用一个二维数组(邻接矩阵)来存储顶点的信息和顶点之间的关系(有向图的弧或无向图的边).其描述形式如下: //图的邻接矩阵存储表示 #define MAX_NUM 20 // 最大顶点个数 enum GraphKind{GY,GN}; // {有向图,无向图} t

Server 2003 DFS客户端设置及安全策略

除了Windows Server 2003家族中基于服务器的DFS(分布式文件系统)组件外,还有基于客户端的DFS组件.DFS客户端可以将对DFS根目录或DFS链接的引用缓存一段时间,该时间由管理员指定.DFS客户端组件可以在许多不同的Windows平台上运行.Windows Server 2003 家族产品支持下列平台上的目标. 一.从其他计算机访问DFS目标 表1 支持DFS的操作系统列表 DFS映射以及客户端计算机访问DFS服务器的过程 DFS映射 默认情况下,DFS映射将自动发布到活动目

分布式文件DFS共享文件不能访问的问题

域控服务器今天出现蓝屏,没办法只能强制重新启动,经过漫长的启动,总算启动好了,不过没几分钟,其他部门就来反映访问不了共享文件,错误提示如下 我看了一下文件共享和服务都打开,没什么问题,但是死活 访问不了,换名字试试,结果可以!!!??? 名字换回来依旧访问不了,会不会DFS出问题了? 打开DFS发现原本发布的共享文件 根目录消失了,点击显示根目录,提示根目录不可用..... 新建根目录,提示根目录已存在,不能新建... 看来问题出在DFS上面,换名字的话,治标不治本,而且客户端工作量巨大,看来要

AD部署教程:分布式文件系统(DFS)(命名空间)

分布式文件系统(DFS,Distributed File System)是文件服务非常重要的一个功能,DFS使用户更加容易访问和管理物理上跨网络分布的文件. 通过DFS,可以将同一网络中的不同计算机上的共享文件夹组织起来,形成一个单独的.逻辑的.层次式的共享文件系统. 在文件服务中直接添加DFS分布式文件系统即可 打开服务器管理可以看到文件服务多了DFS管理右键命名空间,可以打开新建命名空间向导来新建命名空间服务器. 接着是命名空间的名字

UVa 10603:Fill,经典倒水问题+隐式图搜索+dfs

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=110&page=show_problem&problem=1544 类型: 隐式图搜索 原题: There are three jugs with a volume of a, b and c liters. (a, b, and c are positive integers not greater th