洛谷—题解 P1706 【全排列问题】

原题链接P1706全排列问题

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

输入输出格式
输入格式:
n(1≤n≤9)

输出格式:
由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个常宽。

输入输出样例

输入样例#1:
3

输出样例#1:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

题解

题目没有什么难度(如果这句话伤害到了你,那对不起,是我的错),让人无语的是结果的输出格式

卡在输出这里WA了好多次

在这里还是建议用printf输出

printf(“%5d”,&a[i])

输出结果在格式这里就不会错了。

还是简单说一下DFS深度优先搜索,不了解的小伙伴推荐看一下啊哈磊的那本《啊哈!算法》,写的很通俗易懂,也很有趣,适合像我一样初学者的盆友们。

1-9九个数好比1-9九张扑克牌,数组好比盒子。
九个数太多,在这里我就拿1-3举例

开始每个盒子放入对应的扑克,就是1 2 3

走到第4个盒子那里发现手里没有扑克了,就往回走拿起3号盒子里面的3,手里也就只有3没有其他的号码,只好这样,继续往回走;走到2号盒子里拿起2,于是手里就有2和3,2已经放过了,就把3放进去,然后往后走,2放入3号盒子。就是1 3 2

接下来按照刚才的步骤模拟,便会一次生成所有序列

2 1 3

2 3 1

3 1 2

3 2 1

源代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

void dfs(int step);

int a[10],book[10],n;

void dfs(int step)
{
	int i;
	if(step==n+1)
	{
		for(i=1;i<=n;i++)
		printf("%5d",a[i]);
//		cout<<" "<<a[i];
		cout<<endl;
		
		return ;
	}
	
	for(i=1;i<=n;i++)
	{
		if(book[i]==0)
		{
			a[step]=i;
			book[i]=1;
			
			dfs(step+1);
			book[i]=0;
		}
	}
	return ;
}

int main()
{
	cin>>n;
	dfs(1);
//	getchar();getchar;
	return 0;
 } 

如果盆友们理解并掌握了的话,可以尝试着用dfs解决下列问题:
P1008三连击
P1618三连击(升级版)
试着用不同的方式解决问题,问题能给你带来的收益也是不一样的。

新手上路,希望各位大牛多多指教,多多批评;有什么问题可以多多交流

下面是我在洛谷的博客,欢迎大家光临
洛谷博客

我叫Mario,一个立志要考进MIT的程序猿

发布了15 篇原创文章 · 获赞 12 · 访问量 1430

猜你喜欢

转载自blog.csdn.net/qq_41616301/article/details/88764960