HDU 1016 Prime Ring Problem

题目链接:HDU 1016

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

题意

有这样一个环,环上n个点,这n个点由1-n这n个数组成,其中第一个点固定是1,且保证任意相连的两个数之和是素数,在输入n以后把所有符合条件的数字排列输出。

题解:

虽然是n<20,其实数据还是很大的,用DFS去跑,符合条件就输出,在本地运行时,发现当n为奇数时无解,就加上了奇偶判断,节省了一定的时间。另外在初始化时打一个素数表,注意下细节这就是道简单题。

代码

#include<string>
#include<cstring>
using namespace std;
int n;
int state[22] = { 0 };
bool prime[110] = { 0 };
void Init() {
	for (int i(2); i < 45; i++)
		for (int j(2); i*j <= 45; j++)
			prime[i*j] = 1;
}
int a[22] = { 1,1 };
int ans;
void dfs(int x) {
	if (x == n+1) {
		if (!prime[a[n]+ a[1]]) {
			ans++;
			for (int i(1); i <= n; i++) {
				if (i > 1)
					cout << ' ';
				cout << a[i];
			}
			cout << endl;
			return;
		}
		else return;
	}
	for (int i(2); i <= n; i++) {
		if (!state[i]&&!prime[i + a[x - 1]]) {
			a[x] = i;
			state[i] = 1;
			dfs(x + 1);
			state[i]=0;
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	Init();
	int Case = 1;
	while (cin >> n,n) {
		ans = 0;
		memset(state, 0, sizeof state);
		cout << "Case " << Case++ << ":" << endl;
		dfs(2);
		cout <<ans<< endl;
	}
}
原文地址:https://www.cnblogs.com/Titordong/p/9592273.html