题目描述
今天,桐桐的老师布置了一道数学作业,要求列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现重复的数字。因为排列数很多,桐桐害怕写漏了,所以她决定用计算机编程来解决。
输入输出格式
输入格式
一行,只有一个整数n(1≤n≤9)。
输出格式
一行,按字典序输出由1-n组成的所有不重复的数字序列,每行一个序列,每个数字之间有一个空格隔开。
输入输出样例
输入样例
3输出样例
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
题解
经典的暴搜题。这里其实可以用位运算优化,做到更快。
#include <iostream> #include <cstdio> #define lowbit(x) ((x) & -(x)) using namespace std; int n; char a[1 << 8 + 5]; char s[10]; void DFS(int now, int dep) { if(!now) { for(register int i = 1; i < n; ++i) { putchar(s[i]); putchar(' '); } putchar(s[n]); putchar('\n'); return; } int tmp = now, obj; while(tmp) { obj = lowbit(tmp); s[dep] = a[obj]; DFS(now - obj, dep + 1); tmp -= obj; } return; } int main() { scanf("%d", &n); for(register int i = 0; i < 9; ++i) { a[1 << i] = i + '0' + 1; } DFS((1 << n) - 1, 1); return 0; }