HDU 1016 Prime Ring Problem(搜索问题)

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

#include <cmath>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 100010;
int ans[30], vis[30], n;
bool IsPrime(int n) {//判断素数
	for(int i = 2; i <= sqrt(n); i++)
		if(n%i==0) return false;
	return true;
}
void print() {
	for(int i = 1; i <= n; i++) {
		i < n?printf("%d ", ans[i]):printf("%d\n", ans[i]);
	}
}
void dfs(int k, int rt) {//k表示开始的数字
	if(rt == n && IsPrime(k + ans[1])) {//当rt等于n时,输出一次结果
		print();
		return;
	}
	vis[k] = 1;
	ans[rt] = k;
	for(int i = 1; i <= n; i++) {
		if(!vis[i] && IsPrime(i + k)) {//如果这个数没有被访问并且它和k的和为素数,存起来
			ans[rt + 1] = i;
			vis[i] = 1;
			dfs(i, rt + 1);
			vis[i] = 0;
		}
	}
}
int main() {
	int cnt;
	cnt = 1;
	while(scanf("%d", &n) != EOF) {
		printf("Case %d:\n", cnt++);
		memset(ans, 0, sizeof(ans));
		memset(vis, 0, sizeof(vis));
		dfs(1, 1);
		printf("\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Adusts/article/details/81324097
今日推荐