zoukankan      html  css  js  c++  java
  • 简单的全排列问题(给初学者)

    题目描述

    输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

    输入输出格式

    输入格式:

     

    n(1≤n≤9)

     

    输出格式:

     

    由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个常宽。

    输入输出样例

    输入样例#1: 复制
    3
    输出样例#1: 复制
        1    2    3
        1    3    2
        2    1    3
        2    3    1
        3    1    2
        3    2    1

     

    深搜;print为输出函数,%5d就是题目要求 每个数字占五个长宽,
    dfs深搜,if(!a[i])是如果它等于0的意思,dfs(x+1)后面的a[i]=0为回溯,

    执行这个的条件是当for循环完了还不满足if(x==n)是,就执行这一句回溯,
    (可以自己调试看看),回溯后返回上一层,

    也就是x,回溯前是x+1,回溯后是x,可以理解为x+1-1,-1就代表回溯到上一步,
    然后main函数里的dfs(0),为什么是0?

    对于dfs,可以先0,先1,先x……都可以,根据自己的代码来,这里从零开始,
    跳到dfs函数,那么x就等于0,然后紧接着x+1就等于1,b[x+1]=i;

    也就是b[1]=i是刚好的,如果dfs(1),那x+1就等于2,那就错了。
    嗯,,,一开始我也很绝望,,真的看不懂,现在好像也还有点儿,,,我把我

    难理解的写出来了,仅仅是给新手看的。


    我太,,lj了。。。


     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 using namespace std;
     7 int n,b[11];
     8 bool a[233];
     9 void print()
    10 {
    11   for(int i=1;i<=n;i++)
    12     printf("%5d",b[i]);
    13   cout<<endl;
    14 }
    15 void dfs(int x)
    16 {
    17   int i;
    18   if(x==n)
    19   {
    20     print();
    21     return ;
    22   }
    23   for(int i=1;i<=n;i++)
    24   {
    25     if(!a[i])
    26     {
    27       a[i]=1;
    28       b[x+1]=i;
    29       dfs(x+1);
    30       a[i]=0;
    31     }
    32   }
    33 } 
    34 int main()
    35 {
    36   scanf("%d",&n);
    37   for(int i=1;i<=n;i++)
    38     b[i]=i;
    39   dfs(0);
    40 
    41   return 0;
    42 
    43 }

    如果你不开心,那我就把右边这个帅傻子分享给你吧, 

    你看,他这么好看,那么深情的望着你,你还伤心吗? 

    真的!这照片盯上他五秒钟就想笑了。 

    一切都会过去的。



  • 相关阅读:
    linux 安全组
    php 类
    linux安装phpmyadmin
    mysql设置对外访问
    linux 防火墙
    微信小程序之swiper组件高度自适应
    Thinkphp5 关联模型
    README.md文件编辑
    linux安装mysql
    小程序返回顶部top滚动
  • 原文地址:https://www.cnblogs.com/Mary-Sue/p/8545420.html
Copyright © 2011-2022 走看看