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 题意:就是给定一个数n,让你找出所有组成的圆圈,并且组成的圆圈相邻的两个数的和必须是质数,圆圈的首位是1, 思路:每次从2开始搜索,并且用过的数标记掉 AC代码: #include <iostream> #include <cstdio> #include<cmath> #include<algorithm> using namespace std; int n,sc=1; int a[21]; int visit[21]={0}; int ok(int x,int y){//判断质数 for(int i=2;i<=sqrt(x+y);++i){ if((x+y)%i==0){ return 0; } } return 1; } void dfs(int x){//x表示已经选的数的个数 if(x==n&&ok(a[x],1)){ printf("%d",a[1]); for(int j=2;j<=n;j++){ printf(" %d",a[j]); } printf("\n"); return; } for(int i=2;i<n+1;i++){ if(visit[i]==0&&ok(a[x],i)){ a[++x]=i; visit[i]=1; dfs(x); visit[i]=0; x--; } } } int main(){ while(~scanf("%d",&n)){ a[0]=0; a[1]=1; printf("Case %d:\n",sc++); dfs(1); printf("\n"); } return 0; } 注意:在输入的时候!=EOF,求质数的过程中<=sqrt(); 这一题和HDU 1258 都用到了先把一些值储存再打印。。。做过那道这道就简单了。。。。。。。。。。fighting。。。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-10 11:40:55