3 条题解
-
1
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int ans[10]; int arr[10]; int myn; void dfs(int mx){ if(mx == myn+1){ for(int i=1;i<=myn;i++){ printf("%5d",ans[i]); } cout << '\n'; return; }else{ for(int i=1;i<=myn;i++){ if(arr[i]==1){ continue; } if(arr[i] == 0){ ans[mx] = i; arr[i] = 1; dfs(mx+1); arr[i] = 0; } } } return; } int main(){ cin >> myn; dfs(1); return 0; }
-
1
深搜
# include <bits/stdc++.h> using namespace std; int n; int stu[15], ret[15]; void dfs(int k) { if (k > n) { for (int i = 1; i <= n; i++) { printf("%5d", ret[i]); } printf("\n"); } for (int i = 1; i <= n; i++) { if (stu[i] == 0) { stu[i] = 1; ret[k] = i; dfs(k + 1); stu[i] = 0; } } } int main() { cin >> n; dfs(1); return 0; }
-
1
STL 解法
如果不想自己写搜索,这题也可以用 C++STL 当中的
next_permutation
(下一个排列)函数来解决。关于
next_permutation
函数的用法,在这里贴一篇文章:文章链接 。这道题重点使用数组的全排列,需要的参数有数组的开始地址和结束地址。
思路
首先输入 (即数组长度),这里,所以用
int
就行。非完整代码
#include <bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; return 0; }
然后定义一个从1到的数组,方便之后调用全排列函数,并对数组初始化。
#include <bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; int a[n]; for(int i=0;i<n;i++){ a[i]=i+1; } return 0; }
这里如果循环变量
I
是从0开始的,一定要将a[i]
赋值为i+1
,因为序列中不包括0 。接着就循环输出
#include <bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; int a[n]; for(int i=0;i<n;i++){ a[i]=i+1; } do{ for(int i=0;i<n;i++){ printf("%5d",a[i]); } cout<<endl; }while(next_permutation(a,a+n)); return 0; }
这里 do{}while() 循环的意义是将原先数组先输出一遍,因为在题目中这也是一种排列。
next_permutation
函数将对a数组自动进行全排列,并返回:- ture表示仍有其他可用排列。
- false表示无其他可用排列。
也就是说,当没有其他排列方法时,循环便会自动结束。
大功告成!
AC代码(请勿抄袭):
#include <bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; int a[n]; for(int i=0;i<n;i++){ a[i]=i+1; } do{ for(int i=0;i<n;i++){ printf("%5d",a[i]); } cout<<endl; }while(next_permutation(a,a+n)); return 0; }
- 1
信息
- ID
- 680
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 40
- 已通过
- 19
- 上传者