原题链接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的程序猿