AcWing 1537. 递归实现排列类型枚举 II
原题链接
简单
作者:
我要出去乱说
,
2021-02-06 11:34:06
,
所有人可见
,
阅读 2225
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10;
int n;
int a[N], nums[N]; //a储存排序数组, nums是输出数组
bool st[N];
void dfs(int u)
{
if (u == n)
{
for (int i = 0; i < n; i ++ ) cout << nums[i] << ' ';
cout << endl;
return;
}
for (int i = 0; i < n; i ++ )
if (!st[i])
{
nums[u] = a[i];
st[i] = true;
dfs(u + 1); //递归加1
st[i] = false; //还原现场
while (i + 1 < n && a[i + 1] == a[i]) i ++ ; //跳过重复,见下图
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ ) cin >> a[i];
sort(a, a + n); //排序后重复的数字就会排在一起,便于去重
dfs(0);
return 0;
}
# 我也想的剪纸但我想的不是剪枝
orz
厉害👍
为什么我java
就超时了
方法没问题,但是java的scanner和System.out.print是相对比较慢的,可以分别更换成StreamTokenizer和PrintWriter,我换了之后就成功了
思路清晰,不像我是个代笔相半天想不到
哈哈还打错字了🤣