杭電acm 1016 素數環
阿新 • • 發佈:2019-02-16
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; }
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; }