【题解】全排列

题目描述

  今天,桐桐的老师布置了一道数学作业,要求列出所有从数字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;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10500338.html