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 21 6 7 4 3 8 5 2
这道题用dfs就可以ac了,有几个小点,首先是这道题目里面的n的范围是0到20,0到40的范围之内,就只有
12个素数,所以可以直接用一个数组储存所有的素数,当用完一个数字之后要做好标记,但是当回退的时候,
要把标记还原,由于是一个环,那么最后的那个数字和第一个数字也就是1的和,也要是素数,题目里面有
要求正向和反向的输出,但是直接用dfs可以直接输出所有的结果,最后一个数字输出之后,是不能有空格
的,要注意presentation error
#include<iostream> #include<cstring> using namespace std; #define N 25 int prime[12] = {2,3,5,7,11,13,17,19,23,29,31,37}; int mark[N]; int putin[N]; int n; bool is_prime(int a,int b) { for(int i = 0;i<12;i++) if((a+b)==prime[i]) return true; return false; } int DFS(int k) { if(k>n&&is_prime(putin[k-1],1)) { for(int i = 1;i<n;i++) { cout<<putin[i]<<" "; } cout<<putin[n]<<endl; } else { for(int i = 2;i<=n;i++) { putin[k] = i; if(is_prime(i,putin[k-1])&&!mark[i]) { mark[i] = 1; DFS(k+1); } for(int j = 1;j<=k-1;j++) { if(putin[j]==i) { mark[i] = 1; break; } mark[i] = 0; } } } return 0; } int main() { int times = 0; while(cin>>n) { cout<<"Case "<<++times<<":"<<endl; memset(putin,0,sizeof(putin)); memset(mark,0,sizeof(mark)); putin[1] = 1; mark[1] = 1; DFS(2); cout<<endl; } }