AcWing 842 排列数字 题解 (DFS)

#include<iostream>

using namespace std;

const int N = 10;

int path[N];//path[i]记录第i个位置放什么数 
bool st[N];//st[i]记录数字i是否被使用过 
int n;

void dfs(int u){//u代表第u个位置 
	if(u == n){//如果已经放到最后一位,就输出 
		for(int i = 0; i < n; i ++ ){//path数组从第0位开始存,所以从第0位开始输出 
			cout<<path[i]<<" "; 
		} 
		cout<<endl;
		return ;//每种情况输出完成之后返回递归的上一层 
	} 
	//如果所有位置还没全部填满
	for(int i = 1; i <= n; i ++ ){//从1开始枚举要填入path的数 
		if(!st[i]){//如果i没有被用过 
			path[u] = i;//第u个位置就填上i
			st[i] = true;//标记一下i已经被用过,进行下一层递归的时候i就不能再被用
			dfs(u + 1);//进行下一层递归,填下一个位置的数
			st[i] = false;//从下一层递归返回后,就撤销对i的标记,避免妨碍枚举下一种情况 
		} 
	} 
} 

int main()
{
	cin>>n;
	
	dfs(0);//从第一个位置开始
	
	return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值