例题 7-4 素数环(Peime Ring Problem, Uva 524)
程序员文章站
2022-06-02 11:53:12
...
题目
啊咧
提交代码的时候,第一次PE错误,我想了一下可能是 行末打回车前的空格在作怪,一改,还真是。
输出结果的末尾打空格也是不行的,比赛要注意咯。
然后,我的代码好花时间呐,没有对比就没有伤害:
看我的,我这就去用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;
}
下一篇: 树上dp的入门知识