搜索入门——全排列问题

1.问题描述:

搜索入门——全排列问题

2.算法分析:

这道题目其实是搜索入门的一道题搜索,可以使用dfs来搜索,怎么搜索呢,首先我们输入一个n,这个n代表全排列1-n,使用dfs搜索的话,我们要确定边界出口,我们是一步一步去试,每一次次数step + 1,当step比n大的时候就跳出递归,但是我们需要多次搜索,所以需要在选数的时候添加一个记录这个数选与没选的vis标记数组,其实dfs是有模板的,如下:

void dfs(int step)
{
	判断边界
	尝试每一种可能for (int i = 1; i <= n; i++)
	{
		继续下一步dfs(step + 1);
	}
	返回
}

这道题目还可以有一个巧解熟悉C++的一个algorithm的next_permutation
模板如下:
搜索入门——全排列问题

3.源代码:

先贴一份dfs的代码:

#include <iostream>
#include <cstdio>
using namespace std;

int a[10],n; 
bool vis[10];

void dfs(int step) {
	if (step == n + 1) {
		for (int i = 1; i <= n; i++) {
			printf("%5d",a[i]);
		}
		printf("\n");
		return;
	}
	for (int i = 1; i <= n; i++) {
		if (!vis[i]) {
			a[step] = i;
			vis[i] = true;
			dfs(step + 1);
			vis[i] = false;
		}
	}
}

int main() {
	scanf("%d",&n);
	dfs(1);
	return 0;
}

std巧解代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int a[9];

int main() {
	int n;
	scanf("%d",&n);
	for (int i = 0; i < n; i++) {
		a[i] = i + 1;
	}
	do {
		for (int i = 0; i < n; i++) {
			printf("%5d",a[i]);
		}
		printf("\n");
	} while (next_permutation(a,a + n));
	return 0;
}

欢迎关注www.lyxueit.com。一起学习算法。
测试地点落谷:
https://www.luogu.org/problemnew/show/P1706