例题7-4 素数环(Prime RingProblem, UVa 524)

原题链接:https://vjudge.net/problem/UVA-524
分类:回溯法
备注:回溯法和生成-测试法的比较

备注是紫书上的,因为生成-测试法即纯枚举,是行不通的,作者对其进行了一下比较。

代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
int ans[20] = { 1 }, vised[20], isp[40], n, kase;
bool isPrime(int x) {
	if (x == 1)return false;
	int limit = x / 2 + 1;
	for (int i = 2; i < limit; i++)
		if (x % i == 0)return false;
	return true;
}
void dfs(int pos) {
	if (pos >= n) {
		for (int i = 0; i < n; i++)
			printf("%d%c", ans[i], i == n - 1 ? '\n' : ' ');
		return;
	}
	for (int i = 2; i <= n; i++)
		if (!vised[i]) {
			if (!isp[ans[pos - 1] + i])continue;
			if (pos == n - 1 && !isp[i + 1])continue;
			ans[pos] = i;
			vised[i] = 1;
			dfs(pos + 1);
			vised[i] = 0;
		}
}
int main(void) {
	for (int i = 0; i <= 40; i++)
		if (isPrime(i))isp[i] = 1;
	while (~scanf("%d", &n)) {
		if (kase)printf("\n");
		printf("Case %d:\n", ++kase);
		dfs(1);
	}
	return 0;
}
发布了105 篇原创文章 · 获赞 98 · 访问量 4539

猜你喜欢

转载自blog.csdn.net/TK_wang_/article/details/105441440