-
题目描述:
-
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.
-
输入:
-
n (1 < n < 17).
-
输出:
-
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.
-
样例输入:
-
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 2 1 6 7 4 3 8 5 2
-
提示:
-
用printf打印输出。
#include<iostream> #include<stdio.h> #include<queue> using namespace std; int ans[17]; bool mark[17]; bool check(int a){
if ((a%2 == 0||a%3==0||a%5==0)&&a!=2&&a!=3&&a!=5)//因为输入的n<17,所以相邻数字加和小于32,合数的因子就235
return false;
return true;
} int n; void dfs(int cnt){ if (cnt>1 ) if (check(ans[cnt-1]+ans[cnt-2])==false) return; if (cnt==n) if (check(ans[cnt-1]+ans[0])==false) return; if (cnt == n){ printf("1"); for (int i=1;i<n;i++){ printf(" %d",ans[i]); } printf("\n"); } for (int i=2;i<=n;i++){ if (mark[i]==false){ mark[i]=true; ans[cnt]=i; //cnt++; dfs(cnt+1); mark[i]=false; } } } int main (){ int c=0; while (cin>>n){ c++; for (int i=1;i<=n;i++) mark[i]=false; ans[0]=1; mark[1]=true; printf("Case %d:\n",c); dfs(1); printf("\n"); } return 0; }
哎呀呀!他说我超时!!!!找了好久好久好久的bug
后来突然想起之前学长说printf比cout快
然后换了,ac了
刚刚粘题目的时候发现。。提示里面有,我没看见。哭哭
所以说啊,printf好啊,以后尽量用这个吧
这道题也很好啊,
标红是核心,好好看