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.
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.
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; }