1 ~ n 的全排列的个数

拿输入3为例子,首先要从1开始一个一个搜索,输出一遍开始回溯,即123输出之后开始回溯,a【i】重新赋值标记的为0,a【i-1】也为0,由于for的循环,所以结束,输出132,同样回溯的过程也会回溯到第一个数,就是213,同理循环下去,直到回溯完输出完程序继续输入想排的个数。

#include<cstdio>
#include<cstring>
using namespace std;
int a[10],vis[10],n;   // 存数数组,标记数组,几位数
 
 void dfs(int step)
 {
  if(step == n + 1 )  //排一遍输出
  {
   for(int i = 1 ; i <= n ; i ++)
   printf("%d",a[i]);
   printf("\n");
  }
  for(int  i = 1 ; i <= n ; i ++) 
  {
   if(vis[i] == 0 )
   {
    a[step] = i ; 
    vis[i] = 1 ;
    dfs(step + 1);  //递归
    vis[i] = 0 ;   //回溯
   }
  }
 }
int main()
{
 memset(vis,0,sizeof(vis));   //初始化标记数组为 0  
 while(~scanf("%d",&n))
 {
  dfs(1);
    printf("\n");  //从一开始往里搜索 
  } 
 
  return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值