洛谷--p1706(c++)

本文介绍了如何使用深度优先搜索(DFS)算法解决一个关于层次结构的问题,通过bool数组标记已使用的数字,确保每个数字仅出现一次,最终输出指定层数的排列结果。
摘要由CSDN通过智能技术生成

本题是深度优先搜索的模板题,开一个 bool 数组用来判断当前这个数字是否已经被使用了。第一个位置的数字是第 0 层,第二个位置的数字是第一层,以此类推。用 u 表示当前深度优先搜索到了第几层,每次递归调用 dfs。当深搜到所需求的 n 层时,输出已经记录的数组。在每次完成一次搜索时,应该让判断数组和答案数组都还原成原来的样子,进行下一次排列。

#include<iostream>
using namespace std;
int ans[123];
bool tag[123];
int n;
void dfs(int u){
	if(u==n){                        //满足题目所需的层数即输出
		for(int i=0;i<n;i++){
			printf("%5d",ans[i]);
		}
		printf("\n");
		return;
	}
	for(int i=1;i<=n;i++){
		if(!tag[i]){
			ans[u]=i;
			tag[i]=1;        //标记为已使用防止重复使用
			dfs(u+1);
			//ans[u]=0;    //因为ans[u]的值一直被覆盖,所以可以不用还原。
			tag[i]=0;       //使得bool数组置0,即未使用的初态
		} 
	}
}
int main(){
	cin>>n;
	dfs(0);
} 
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值