1. 程式人生 > >杭電acm 1016 素數環

杭電acm 1016 素數環

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格式變態,一直以為最後不輸出空行,PE6次,簡單的dfs.由於資料較小,直接素數手動打表了,懶得寫函式。顯然奇數是不成立的,所以只能輸入偶數。#include<stdio.h> #include<string.h> int value[40]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0}; //素數打表,1素數,0非素數。從0-40.  int v[25],a[25];                        //v作為使用的標記,a儲存n個數  void dfs(int x,int y) { int i; if(x==y+1&&value[a[1]+a[y]]==1)    //x遞迴到y+1屍,且最後一個數跟1的和是素數   結束  { printf("1");                   //1每次都作為開頭輸出         for(i=2;i<=y;i++)         printf(" %d",a[i]);            //注意空格          printf("\n");                  //空行          return ; } for(i=2;i<=y;i++)                  //從2開始計數  { if(v[i]==0&&value[i+a[x-1]])   //i沒被利用且這個數加陣列a中的前一個數是素數  { v[i]=1;                    //標記  a[x]=i;                    //儲存  dfs(x+1,y);                //回溯  v[i]=0;                    //恢復原狀態   } } } int main() { int T=1,i,n; while(scanf("%d",&n)!=EOF) { printf("Case %d:\n",T++); if(n==1)                      //1單獨處理  { printf("1\n"); continue; } //if(n%2==1) //        { //            printf("No Answer\n");   //奇數不成立  //            flag=1; //            continue; //        }         memset(v,0,sizeof(v));         //清空陣列v為0          v[1]=a[1]=1;                   //當n=1時,成立          dfs(2,n);         printf("\n");                  //狗血的換行  } return 0; }