P1706 全排列问题

来弥补一篇博文。

相信在做dl们都知道并且用过dfs吧,他跟bfs有什么区别?

通俗一点来讲就是dfs好用,代码量少,但是理解难度极大

bfs不好用,代码量多,但是理解单独简直超简单。

下面重点来了

重点啊,划重点划重点

dfs和bfs的用处何在?

dfs是在用求连通块面积的,

bfs是在用求连通块数量的。

哈我到底在说啥,说的就是八个字:“dfs好用!!!

那你还是可能不知道我要干啥,别急别急,看标题

P1706 全排列问题

唉这就是重点吗,看起来只需要一个循环就能搞定的事情,实则没那么简单。

题中明说按照字典序输出自然数 11 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。哦全排列懂了吧。你知道要用什么吗?dfs!!!

我的思路是这样的,最近有一个粉丝宝宝给我说我需要添加一个输出函数,但是我觉得这个题中就不需要那么麻烦,那什么能让我们又快又nice的完成这道题呢,萌新们在int main里写循环我很理解,但是像我们这种高手需要吗?不需要,我们用函数来写有问题吗?没有问题。

上代码
 

#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
const int N=9;
int v[N+2],a[N+2],n;//二数组一变量,简单环保
void dfs(int);//dfs函数登场喽
int main()
{
	cin>>n;
	dfs(0);//逐步进入到dfs函数
	return 0;
}
void dfs(int stp){//开始进入到dfs运算中
	if(stp==n){
		for(int i=0;i<n;i++){
			cout<<setw(5)<<a[i];
		}
		cout<<endl;
		return ;
	}
	for(int i=1;i<=n;i++){
		if(v[i]==0){
			v[i]=1,a[stp]=i;
			dfs(stp+1);
			v[i]=0;
		}
	}
	return;
}

可能会有粉丝宝宝问我说setw是什么,这里给大家一个答案setw(5)是指输出五个空格,另外要注意哦,要想引用setw必须先写头文件#include<iomanip>。当然万能更香,毕竟iomanip包含在万能里面吗!

这道题可谓是dfs最简单的一道题,也算是入门题吧。期待你的关注,我们下次在讲一道bfs的题,我们下期再见,拜拜!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值