全排列

#include<bits/stdc++.h>
using namespace std;

int n,vis[15],a[15];     //vis用来记录已存入数组中的数

void permutation(int k)
{
    if(k-1==n)                  //k表示当前填写第几格,所以要后退一格
    {
        for(int i=1;i<=n;i++)
            printf("%5d",a[i]);
        printf("\n");
        return ;
    }
    for(int i=1;i<=n;i++)
    {
          if(!vis[i])
          {
            vis[i]=1;
            a[k]=i;
            permutation(k+1);
            vis[i]=0;
          }
    }
}

int main()
{
    scanf("%d",&n);
    permutation(1);    //从第一格开始。

    return 0;
}

代码整体思路:全排列一定是从小到大,所以只需要从1到n依次查找填入即可,每进入一次递归,循环都会从1~n查询未被填入的数字,填入数字即进入下一次递归,若递归中数组被填满(k-1=n),则输出序列,且从k-1格向前回溯,一直到i!=n的递归中,回溯当前格停止。

posted @ 2024-11-25 21:39  _窗帘  阅读(12)  评论(0)    收藏  举报