HOJ 1016 Prime Ring Problem

暴力深搜,注意找到解时的停止

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 20;
int a[MAXN], vis[MAXN], prime[2 * MAXN];
//a为存储目标序列,vis判断每个数字是否“已读”, prime存储是否素数
int n;

void iniPrime() {//素数数组初始化
	memset(prime, 0, sizeof(prime));
	prime[2] = 1;
	prime[3] = 1;
	for(int i = 4; i < 2 * MAXN; i++)
		for (int j = 2; j <= (int)sqrt(i); j++) {
			if (i % j == 0) break;
			if (j == (int)sqrt(i)) prime[i] = 1;
		}
}

int isPrime(int k) {
	return prime[k];
}

void dfs(int k, int time) {
	if (time > n) return;//time大于给定输入时直接返回
	if (time == n && isPrime(k + 1)) {
		//数字个数刚好为输入要求时,进行判断,满足要求则为一个解。因判断顺序是以经按照字典序进行的,故只要得到满足地解直接输出即可
		for (int i = 0; i < time - 1; i++)
			cout << a[i] << " ";
		cout << a[time - 1] << endl;
		return;
	}
	for (int i = 2; i <= n; i++)
		if (isPrime(k + i) && vis[i] == 0) {//与相邻数和为素数则进行下一步
			vis[i] = 1;
			a[time] = i;
			dfs(i, time + 1);
			vis[i] = 0;
		}
}

int main() {
	int t = 1;
	memset(a, 0, sizeof(a));
	memset(vis, 0, sizeof(vis));
	a[0] = 1;
	vis[0] = 1;
	iniPrime();
	while (cin >> n) {
		cout << "Case " << t++ << ":" << endl;
		dfs(1, 1);
		cout << endl;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_44724908/article/details/104006037