题目
把 1∼
n
n
n 这
n
n
n 个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入格式
一个整数
n
n
n。
输出格式
按照从小到大的顺序输出所有方案,每行 1 个。
首先,同一行相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。
数据范围
1
服务器托管网 ≤
n
≤
9
1≤n≤9
1≤n≤9
输入样例
3
输出样例
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
思路
该问题也被称为全排列问题,所有可能的方案总数是
n
!
n!
n! 种。在这里,递归需要求解的问题是 “把指定的
n
n
n 个整数按照任意次序排列”,在每次递归中,尝试把每个可用的数作为数列中的下一个数,求解 “把剩余
n
−
1
n-1
n−1 个整数按照任意次序排列” 这个规模更小的子问题。
代码
#include
using namespace std;
int order[15]; //按顺序依次记录被选择的整数
bool chosen[15]; //标记被选择的整数
int n;
void dfs(int cur) {
if (cur == n + 1) { //问题边界
for (int i = 1; i n; i++) {
printf("%d ", order[服务器托管网i]);
}
puts("");
return ;
}
for (int i = 1; i n; i++) {
if (chosen[i]) continue;
order[cur] = i;
chosen[i] = true; //标记i被选择了
dfs(cur + 1);
chosen[i] = false; //回溯到上一个问题前,恢复现场
order[cur] = 0; //本行可以省略,因为每次都会被重新赋值
}
}
int main() {
scanf("%d", &n);
dfs(1);
return 0;
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: IntersectionObserver v2版本
业务需要内容展示后日志打点,于是使用到了IntersectionObserver,实践中发现一个问题:如果内容出现在了可视区内,但是被其他元素遮挡住了,这时候仍然会打日志。 于是寻找解决方案,发现IntersectionObserver 还有一个v2版本,刚好…