Prime ring problem,递归,广搜,回溯法枚举,很好的题

题目描述:

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(" "); } 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: ",c); dfs(1); printf(" "); } return 0; }

哎呀呀!他说我超时!!!!找了好久好久好久的bug

后来突然想起之前学长说printf比cout快

然后换了,ac了

刚刚粘题目的时候发现。。提示里面有,我没看见。哭哭

所以说啊,printf好啊,以后尽量用这个吧

这道题也很好啊,

标红是核心,好好看

原文地址:https://www.cnblogs.com/yexiaoqi/p/7240717.html