欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

例题 7-4 素数环(Peime Ring Problem, Uva 524)

程序员文章站 2022-06-02 11:53:12
...

题目

题目传送门

啊咧

提交代码的时候,第一次PE错误,我想了一下可能是 行末打回车前的空格在作怪,一改,还真是。
输出结果的末尾打空格也是不行的,比赛要注意咯。
然后,我的代码好花时间呐,没有对比就没有伤害:
例题 7-4 素数环(Peime Ring Problem, Uva 524)
看我的,我这就去用C++的*next_permutation()一遍试试,嘿嘿!

AC代码

//4/1/20:09 _  20:40 
//@reasonbao
//comn on, you guy! do it!
#include <iostream>
#include <cstdio>

using namespace std;

bool PrimeJudge(int n) {
	bool is_prime = true;
	for (int i = 2; i <= n-1; i++) {
		if (n % i == 0) {
			is_prime = false;
			break;
		}
	}
	return is_prime;
}
//回溯法 
void Operate(int n, int *A, int cur) {
	if (cur == n) {		//能递归到这,说明满足条件	
		for (int i = 0; i < n; i++) {
//			cout << A[i] << " ";		PE错误 
			if (i != n-1) cout << A[i] << " ";
			else cout << A[i] << endl;
		}
//		cout << endl;
	}
	for (int i = 2; i <= n; i++) {	//A[cur] 尝试填入各种情况 
		bool is_ok = true;
		for (int j = 0; j < cur; j++) {
			if (i == A[j] ) {		//填过的情况 
				is_ok = false;
				break;
			}
			if (!PrimeJudge(A[cur-1] + i)) {	//与前一个数相加 非素数情况 
				is_ok = false;
				break;
			}
		}
		if (cur == n-1) {		//填最后一个数的情况,判断首尾相加是否素数
			if (!PrimeJudge(i + A[0])) is_ok = false;				 
		}
		
		if (is_ok) {
			A[cur] = i;
			Operate(n,A,cur+1);
		}
	}
}

int main() {
	int A[20];
	int n;
	int kase = 0;
	while (scanf("%d", &n) != EOF) {
		kase++;
		if (kase > 1) cout << endl;
//		cout << PrimeJudge(n) << endl;
		printf("Case %d:\n", kase);
		A[0] = 1;	//枚举以1开头的情况即可
		Operate(n, A, 1);
	}
	return 0;
}