深搜DFS的题,不会做了,下面有80分代码,怎么改
题目描述
给定一个n,求1..n组成的环,使得环上相邻的元素和为素数。
输入
n(1<=n<=17)
输出
把1放在第一位置,按照字典顺序不重复的输出所有解(顺时针,逆时针算不同的两种),相邻两数之间严格用一个整数隔开,每一行的末尾不能有多余的空格。
如果没有答案请输出"no answer"
样例输入 复制
8
样例输出 复制
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
标签
深搜DFS
#include <iostream>
#include <vector>
using namespace std;
bool isPrime(int num) {
if (num < 2) {
return false;
}
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
void dfs(int cur, int n, vector<int>& path, vector<bool>& visited) {
if (cur == n && isPrime(path[cur - 1] + path[0])) {
for (int i = 0; i < n; i++) {
cout << path[i] << " ";
}
cout << endl;
return;
}
for (int i = 2; i <= n; i++) {
if (!visited[i] && isPrime(path[cur - 1] + i)) {
visited[i] = true;
path[cur] = i;
dfs(cur + 1, n, path, visited);
visited[i] = false;
}
}
}
void f(int n) {
vector<int> path(n);
vector<bool> visited(n + 1, false);
path[0] = 1;
visited[1] = true;
dfs(1, n, path, visited);
}
int main() {
int n;
cin >> n;
f(n);
return 0;
}