Prime Ring Problem
HDU - 1016
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.
You are to write a program that completes above process.
Print a blank line after each case.
6 8
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
AC代码:
#include<iostream> #include<stdio.h> using namespace std; int n,num[25],mark[25]; int is_prime(int sum) { for(int i=2;i<sum;++i) if(sum%i==0) return 0; return 1; } void print_num() { for(int i=1;i<n;++i) printf("%d ",num[i]); printf("%d",num[n]); } int dfs(int pre,int post,int flag) //pre:前一个数,post:当前数 { //flag:记录当前一共有几个数 if(!is_prime(pre+post))return 0; num[flag]=post; //第flag个数更新为post if(flag==n&&is_prime(post+1)) { print_num(); printf("\n"); return 1; } mark[post]=0; //如果这个数被用过了,则记录为0 for(int i=2;i<=n;++i) { if(mark[i]==1&&dfs(post,i,flag+1)) break; //遇到符合条件的i即停止 } mark[post]=1; return 0; } int main() { int t=1; while(scanf("%d",&n)!=EOF){ printf("Case %d:\n",t++); for(int i=2;i<=n;++i) mark[i]=1; num[1]=1;mark[1]=0; //第一个数为1 if(n==1)printf("1\n"); for(int i=2;i<=n;++i){ dfs(1,i,2); } printf("\n"); } return 0; }