全排列问题

题目描述:
 
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入
n(1≤n≤9)
输出
由1~n组成的所有不重复的数字序列,每行一个序列。(每一个数占5个字符)
样例输入
 3
样例输出
    1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

解决过程:

#include<bits/stdc++.h>
using namespace std;
int a[15],b[15];
int n,i;
int dfs(int);
int main()
{
    cin>>n;
    for(i=1;i<=n;i++)
        a[i]=i;
    dfs(0);
    return 0;
 } 
 int dfs(int weishu)
 {
     if(weishu==n)
     {
         for(i=1;i<=n;i++)
             cout<<setw(5)<<a[i];
         cout<<endl;
         return weishu--;
     }
     weishu++;
     for(int j=1;j<=n;j++)
         if(b[j]==0)
         {
             a[weishu]=j;
             b[j]=1;
             dfs(weishu);    
            b[j]=0;

         } 
    

 }

 

代码自己看,当时随便写的,没怎么下功夫

我就强调一点(真)

最后一个for循环里j=1前面一定要加int

我的理解是:

如果不加的话j调用的是全局变量

但如果是加了int的话,调用的是局部变量

换句话说,调用几次就有几个j

每个j都不相关联

但如果不加int

就一共只有一个j,后面的j的改变会影响前面的回溯与归零(b[j]=0;)

一点要注意,耽误了我好长时间(-_-||)

posted @ 2022-08-23 17:54  董苏铭  阅读(21)  评论(0编辑  收藏  举报