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简单的搜索题目,不过我还是好长时间没通过。。。 code: #include<stdio.h> #include<string.h> int num[40]; int mark[120]; int prime[40]; void dfs(int root,int n,int m){ int i,j; if(m>n&&!prime[num[n]+num[1]]){ //当搜索完后且第一个数和最后一个数也符合条件 for(j=1;j<n;j++) //的时候输出 printf("%d ",num[j]); printf("%d\n",num[n]); //前边的数跟后边的数分开输出 return; } for(i=1;i<=n;i++){ if(!prime[i+root]&&!mark[i]){ //对数进行判断,如果每相邻两个数之和都为素数且未被标记 num[m]=i; //则满足条件 mark[i]=1; //对处理过的数字进行标记 dfs(i,n,m+1); //返回下一个要搜索的数字 mark[i]=0; } } } int main(){ int k,n,m,t,i,j; int cas=1; memset(prime,0,sizeof(prime)); prime[0]=prime[1]=1; for(i=2;i*i<40;i++){ //打表,不是素数的标记为1 if(!prime[i]) for(j=i*i;j<40;j+=i) prime[j]=1; } while(~scanf("%d",&n)){ memset(mark,0,sizeof(mark)); printf("Case %d:\n",cas++); num[1]=1; mark[1]=1;//1不用判断,直接标记 dfs(1,n,2); printf("\n"); } return 0; }
南阳oj上边有一道几乎相同的题目:
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=488
大体思路还是相同的
代码: #include<stdio.h> #include<string.h> int mark[50]; int num[50]; int prime[50]; void dfs(int root,int n,int m){ int i,j; if(m>n&&!prime[num[1]+num[n]]){ for(j=1;j<=n;j++) printf("%d ",num[j]); printf("\n"); // printf("%d\n",num[n]); } // printf("No Answer\n"); for(i=1;i<=n;i++){ if(!mark[i]&&!prime[i+root]) { num[m]=i; mark[i]=1; dfs(i,n,m+1); mark[i]=0; } } return; } int main(){ int i,j,k,t; int n,m; int Case=1; memset(prime,0,sizeof(prime)); prime[0]=prime[1]=1; for(i=2;i<50;i++){ if(!prime[i]) for(j=i*i;j<50;j+=i) prime[j]=1; } //for(i=0;i<50;i++){ // if(!prime[i]) // printf("%d ",i); //} while(~scanf("%d",&n),n!=0){ memset(mark,0,sizeof(mark)); memset(num,0,sizeof(num)); num[1]=1; mark[1]=1; printf("Case %d:\n",Case++); if(n==1) printf("%d\n",1);//这部分比较容易忽略, else if(n&1) printf("No Answer\n"); else dfs(1,n,2); // printf("\n"); } return 0; }