Prime RingProblem素环问题(DFS 问题)

1人阅读 评论(0) 收藏 举报
分类:

Prime RingProblem素环问题

Problem Description

A ring is composeof n circles as shown in diagram. Put natural number 1, 2, ..., n into eachcircle separately, and the sum of numbers in two adjacent circles should be aprime.
Note: the number of first circle should always be 1.

环是组合成n个圆圈所示的图。把自然数1,2,...,n为进分别各圈,和数字中的两个相邻圈之和应该是一个素数。

注意:第一圈的数量始终应为1。

Input

n (0 < n <20).

Output

The output formatis shown as sample below. Each row represents a series of circle numbers in thering beginning from 1 clockwisely and anticlockwisely. The order of numbersmust 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.

输出格式如下图所示的样品。每一行代表一个系列的圆形数字的环从1开始顺时针和按逆时针方向。号的顺序,必须满足上述要求。在字典顺序打印解决方案。

请你写一个程序,完成上述过程。

打印每个案例后,一个空行。

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 <stdio.h>
#include <stdlib.h>

int num[21],mark[21],n;
int prime_num[12] = {2,3,5,7,11,13,17,19,23,29,31,37};

//判断是否是质数,是返回1,不是返回0
int is_prime(int a)
{
	int i;
    for(i = 0; i < 12;i++)
    if(a==prime_num[i])
	return 1;
    return 0;
}
void print_num()
{
	int i;
    for(i = 1; i < n;i++)
    printf("%d ",num[i]);
    printf("%d",num[n]);
}

int dfs(int pre,int post,int flag)
{
    //如果不符合,直接返回
    int i;
    if(!is_prime(pre+post))//前+后若不是素数,则返回 0 
    return 0;
    num[flag] = post;
    if(flag==n&&is_prime(post+1))
    {
        print_num();
        printf("\n");
        return 1;
    }
    //使用过了这个数字就标记为0
    mark[post] = 0;
    for( i = 2;i<=n;i++)
    if(mark[i]!=0 && dfs(post,i,flag+1))
	break;
    //标记位恢复原状
    mark[post] = 1;
    return 0;
}

int main()
{
    int count,i;
    count = 1;
    while(scanf("%d",&n)!=EOF)
    {
        for(i = 1; i <= n; i++)
        mark[i] = i;
        num[1] = 1;
        printf("Case %d:\n",count++);
        if(n==1)printf("1\n");
        for(i = 2;i<=n;i++)
        dfs(1,i,2);
        printf("\n");
    }
    return 0;
}

查看评论

Prime RingProblem素环问题 14

Prime RingProblem素环问题 Problem Description A ring is composeof n circles as shown in diagram. Put n...
  • quentain
  • quentain
  • 2015-11-25 20:21:40
  • 1297

[Wikioi 1031]质数环---HBNU的童鞋过来看看

题目描述 Description 一个大小为N(N 输入描述 Input Description 只有一个数N,表示需求的质数环的大小。如: ...
  • qpswwww
  • qpswwww
  • 2014-05-26 17:21:45
  • 1088

回溯法---->哈密顿环

哈密顿环 1、问题描述 设G =(V,E)是一个n 结点的连通图。一个哈密顿环是一条沿着图G 的n 条边环行的路径, 它访问每个结点一次并且返回到它的开始位置。 图G1含有一个哈密顿环1->...
  • ncepustrong
  • ncepustrong
  • 2013-05-16 10:22:39
  • 1614

poj 3984 迷宫问题【dfs+路径输出】

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12317   Accepted...
  • liuke19950717
  • liuke19950717
  • 2015-12-06 19:13:37
  • 727

c语言素数环问题(回溯)

Problem F 素数环问题 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 把1到20这重新排列,使得排列后的序列A满足: a. 任意相邻两个数之和是素数 ...
  • geshengtong
  • geshengtong
  • 2017-10-31 20:24:53
  • 416

Prime RingProblem

Prime RingProblem Description A ring is compose of n circles as shown in diagram. Put natural...
  • xbgdzj
  • xbgdzj
  • 2018-02-20 19:37:48
  • 10

dfs找环

对于dfs找环,实际上就是和图上的dfs树是一个套路, 对于一个在有向图的dfs树上的返祖边,凭借这条边必定会构成一个环, 然后我们把运行时的栈中从返祖的祖先那个点之上所有点按顺序都取出来就是我们...
  • running_in_dark
  • running_in_dark
  • 2016-10-22 22:16:20
  • 1039

约瑟夫环问题的两种解决方式(递归求解和数组模拟求解)

约瑟夫环问题各位Acmer肯定都遇到过,就是给你编号为从0~n-1的n个人,从头开始报数,报到m的人离场,问最后留下的人是几号。有两种方法解决这个问题 第一种:数组模拟 这种方法没什么好说的,就是模拟...
  • Sara_YF
  • Sara_YF
  • 2016-06-19 13:03:26
  • 1202

Java实现约瑟夫环问题

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;...
  • qq_21150865
  • qq_21150865
  • 2017-03-05 14:48:34
  • 5598

hdu--1016 素素环(dfs)

#include "stdio.h"#include "string.h"#include "math.h"int visit[22],save[22];int n,k=1,cur;int Ispri...
  • zhoulingjie311
  • zhoulingjie311
  • 2011-06-12 11:17:00
  • 306
    个人资料
    持之以恒
    等级:
    访问量: 6264
    积分: 1729
    排名: 2万+
    文章存档
    最新评论