我正在解决一个回溯问题。我必须构造一个长度为n的排列使每个相邻元素的和都是素数。排列是圆形的,最后一个元素与第一个元素相邻。请注意,所有有效的排列都应该以1开头。
void recurse(int i, int prev, int n, vector<int> prime_ring) {
if (i == n) {
prime_ring.insert(prime_ring.begin(), 1);
if (!is_prime[prime_ring.back() + 1])
return;
for (auto data : prime_ring)
cout << data << " ";
cout << "n";
prime_ring.clear();
return;
}
for (int next = 2; next <= n; next++) {
if (!seen[next] && is_prime[prev + next]) {
prime_ring.push_back(next);
seen[next] = true;
recurse(i + 1, next, n, prime_ring);
seen[next] = false;
prime_ring.pop_back();
}
}
}
上面的代码正确地生成所需的排列。例如n = 4。排列顺序应为
1 2 3 4
1 4 3 2
void recurse(int i, int prev, int n) {
if (i == n) {
prime_ring.insert(prime_ring.begin(), 1);
if (!is_prime[prime_ring.back() + 1])
return;
for (auto data : prime_ring)
cout << data << " ";
cout << "n";
prime_ring.clear();
return;
}
for (int next = 2; next <= n; next++) {
if (!seen[next] && is_prime[prev + next]) {
prime_ring.push_back(next);
seen[next] = true;
recurse(i + 1, next, n);
seen[next] = false;
prime_ring.pop_back();
}
}
}
将prime_ring
更改为全局向量,会导致运行时错误。这个问题发生在我身上很多次,我没有意识到是什么错了。我不知道全局向量和函数参数向量之间的区别。
我不知道全局向量和函数参数向量之间的区别。
不同的是,当您传递vector
作为参数时,vector
被复制。另一方面,当你使用全局变量时,只有一个"向量"。
这里的解决方案是不使用全局变量,因为你有一个工作函数。
假设您在
recurse(i + 1, next, n);
wherei == n - 1
假设进入recurse
函数时,is_prime[prime_ring.back() + 1]
为true
。
然后调用prime_ring.clear();
,并返回
prime_ring.pop_back();
如果你尝试从一个空向量pop_back()
会发生什么?好吧,不好的事情可能会发生(即未定义行为)