使用回溯来输出符合条件的所有 n 个数字排列
我想做一个算法,读取整数 n、a 和 b,并输出 n 个数字的所有排列,其中数字 a 和 b 是连续的。
例如,如果 n=3,a=1,b=2,它应该输出 123 312。
我使用回溯来找到所有 n 个数字排列,但我不知道应该在哪个函数中以及在哪里放置我的条件,如果那是一件事的话。
void out()
{
for (int i = 1; i <= n; ++i)
cout << x[i];
cout <<" ";
}
void back(int k)
{
int i;
for (i = 1; i <= n; ++i)
{
if (!p[i])
{
x[k] = i;
p[i] = 1;
if (k < n)
back(k+1);
else
out();
p[i] = 0;
}
}
}
I want to make an algorithm that reads the integers n, a and b and outputs all the permutations of n numbers where the numbers a and b are consecutive.
For example, if n=3, a=1, b=2 it should output 123 312.
I've used backtracking in order to find all n numbers permutations, but I don't know in what function and where I should put my condition, if that is even a thing.
void out()
{
for (int i = 1; i <= n; ++i)
cout << x[i];
cout <<" ";
}
void back(int k)
{
int i;
for (i = 1; i <= n; ++i)
{
if (!p[i])
{
x[k] = i;
p[i] = 1;
if (k < n)
back(k+1);
else
out();
p[i] = 0;
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使用标准算法让您的生活更轻松。特别是,有
std::next_permutation
来获取所有排列。然后,您可以遵循 Jarod42 评论中的建议,并将12
视为单个元素。这样,任何排列都有1
和2
相邻:或者,不要将
12
视为单个元素并检查循环中的条件:If您只需要打印排列,不需要将它们存储在向量中,而是直接打印它们。
Use standard algorithms to make your life easier. In particular, there is
std::next_permutation
to get all permutations. Then you can either follow the advice in a comment from Jarod42 and treat12
as a single element. In that way any permutation has1
and2
adjacent:Alternatively, do not treat
12
as singe element and check the condition in the loop:If you only need to print the permutations you need not store them in a vector, but print them directly.