zoukankan      html  css  js  c++  java
  • HDU 1016 Prime Ring Problem(经典DFS+回溯)

    Prime Ring Problem

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

    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

    题目链接:HDU 1016

    经典的DFS回溯题目,以前一直想做来着,但是不懂回溯搜索,现在类似的一些题还是挺简单的……,这题用输出外挂可以优化到200+MS,题意是把1-n中所有自然数全部排完才能算一个环,刚开始搞错了输出爆炸……

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<sstream>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<deque>
    #include<stack>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<map>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define MM(x,y) memset(x,y,sizeof(x))
    #define LC(x) (x<<1)
    #define RC(x) ((x<<1)+1)
    #define MID(x,y) ((x+y)>>1)
    typedef pair<int,int> pii;
    typedef long long LL;
    const double PI=acos(-1.0);
    const int N=50;
    int prime[N];
    int pos[N],vis[N];
    int n;
    void Out(int a)
    {
        if(a>9)
            Out(a/10);
        putchar(a%10+'0');
    }
    inline bool check()
    {
    	for (int i=1; i<=n; ++i)
    	{
    		if(!vis[i])
    			return false;
    	}
    	return true;
    }
    void dfs(int now)
    {
    	if(now==n)
    	{
    		if(prime[pos[now]+pos[1]]&&check())
    		{
    			for (int i=1; i<=n; ++i)
    			{
    				Out(pos[i]);
    				putchar(i==n?'
    ':' ');
    			}
    		}
    		return ;
    	}
    	for (int i=2; i<=n; ++i)
    	{
    		if(!vis[i]&&prime[i+pos[now]]&&now<=n)
    		{
    			vis[i]=1;
    			pos[now+1]=i;
    			dfs(now+1);
    			pos[now+1]=0;
    			vis[i]=0;
    		}
    	}
    }
    int main(void)
    {
    	int i,j;
    	for (i=0; i<N; ++i)
    		prime[i]=1;
    	prime[1]=0;
    	for (i=2; i<N; ++i)
    		for (j=2; j*i<N; ++j)
    			prime[i*j]=0;
    	int tcase=0,m;
    	while (~scanf("%d",&n))
    	{
    		MM(pos,0);
    		vis[1]=1;
    		pos[1]=1;
    		printf("Case %d:
    ",++tcase);
    		dfs(1);
    		putchar('
    ');
    	}
    	return 0;
    }
  • 相关阅读:
    输入一个nxn矩阵各元素的值,球出两条对角线元素之和
    打印杨辉三角
    编写一个函数,实现两个字符串的连接功能
    字符串置换。将字符串s中的出现的字符s1用字符s2置换
    有一行文字,要求删去其中某个字符
    自定义函数delstr()的功能是删去字符串s1中所有的"*"
    用微软的kestrel在Linux上利用Apache架设Asp.Net Core环境
    2012年8月14日 星期二 equals()方法 (冲突备份)
    jquery 操作DOM 案例
    FileUpload 控件上传图片和文件
  • 原文地址:https://www.cnblogs.com/Blackops/p/5766278.html
Copyright © 2011-2022 走看看