C++全排列问题

d17089c19b9f4a4697c30fedfdf69fce.png

219f1d489c1c41f091faaaa58bf54ee8.png 

 方法一:

#include<iostream>

#include<iomanip>

#include<algorithm> 

using namespace std;

int n,a[10],book[10];

void dfs(int step)

{

 if(step==n)

 {

  for(int i=0;i<n;i++)

  cout<<setw(5)<<a[i];

  cout<<endl;

  return;

 }

 for(int i=1;i<=n;i++)

 {

  if(book[i]==0)

  {

   a[step]=i;

   book[i]=1;

   dfs(step+1);

   book[i]=0;

  }

 }

}

int main()

{

 cin>>n;

 dfs(0);

 return 0;

}

核心dfs思想:

void dfs(int step)

{

 if(到达目的地)

 {

  输出解

  返回 

 }

 合理的剪枝操作

 for(int i=1;i<=枚举数;i++)

 {

  if(满足条件)

  {

   更新状态位;

   dfs(step+1);

   恢复状态位; 

  }

 } 

}

方法二:

#include<iostream>

#include<algorithm>

#include<iomanip>

using namespace std;

int n,a[10];

int main()

{

 cin>>n;

 for(int i=0;i<n;i++)a[i]=i+1; 

 do

 {

  for(int i=0;i<n;i++)  

  cout<<setw(5)<<a[i];

  cout<<endl;

 }while(next_permutation(a,a+n));

 return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_eatorange

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值