栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

1.3.1 全排列问题(C++实现)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1.3.1 全排列问题(C++实现)

题目叙述

输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入

第一行为一个整数n

输出

由 1 至 n 组成的所有不重复的数字序列,每行一个序列。

每个数字之间由空格隔开

样例输入 1
3
样例输出 1
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
提示

1 ≤ n ≤ 9 1 le n le 9 1≤n≤9

实现思路

通过深度优先搜索。

首先,设置暂时存放值的 arr 数组和 用来判断数字是否遍历过的 visited 数组。

初始化 visited 数组后,从 1 开始 dfs(dfs 的形参 num 代表第几个数)。

  • 对于每一次 dfs() ,
    • 如果 num 已经超过 n ,则对 arr 进行输出后返回;
    • 没有超过 n 时,进行从 1 到 n 的遍历,寻找没有被遍历过的数字。循环中,如果 i 未被访问过,
      • 则将 i 存至 arr ,并将 visited[i - 1] 设为 true,随后再进行 dfs;
      • 回溯时,将回溯时,将 i 出栈,visited[i - 1] 重新设为 false。
实现代码(C++)
#include 
#include 

using namespace std;

int n;
vector arr;
vector visited;

void print() {
	for (auto i : arr) {
		cout << i << ' ';
	}
	cout << endl;
}

// dfs 深搜,num 代表第几个数字
void dfs(int num) {
	if (num > n) { // 已经超过 n 个数了,输出并返回即可
		print();
		return ;
	}
	
	for (int i = 1; i <= n; i++) {
		if (visited[i - 1]) { // 已访问过,继续下一个
			continue;
		}
        // 未访问过,将 i 入 arr,并将 visited[i - 1]设为 true
		arr.push_back(i);
		visited[i - 1] = true;
		dfs(num + 1);
        // 回溯时,将 i 出栈,visited[i - 1] 重新设为 false
		arr.pop_back();
		visited[i - 1] = false;
	}
}

int main() {
	cin >> n;
    // 初始化 visited 数组
	visited = vector(n, false);
	
	dfs(1);
	
	return 0;
}
暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015137.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号