全排列函数dfs
时间: 2023-10-13 21:06:15 浏览: 60
好的,这是一个简单的递归实现的全排列函数dfs,可以参考:
```python
def dfs(nums, path, res):
if not nums:
res.append(path)
return
for i in range(len(nums)):
dfs(nums[:i] + nums[i+1:], path + [nums[i]], res)
nums = [1, 2, 3]
res = []
dfs(nums, [], res)
print(res) # [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
```
其中,`nums` 是待排列的列表,`path` 是当前路径,`res` 是存放所有排列结果的列表。在每次递归时,我们将当前元素加入路径 `path` 中,并从 `nums` 中去掉该元素进行下一层递归,直到 `nums` 为空,将当前路径 `path` 加入到结果列表 `res` 中。
相关问题
DFS全排列python
以下是一个使用DFS算法实现全排列的Python代码:
```python
def permute(nums):
def dfs(nums, path, res):
if not nums:
res.append(path)
return
for i in range(len(nums)):
dfs(nums[:i] + nums[i+1:], path + [nums[i]], res)
res = []
dfs(nums, [], res)
return res
```
该函数接受一个列表nums,返回所有可能的排列方式。在函数中,我们使用了一个嵌套的dfs函数来进行深度优先搜索。对于每一次递归,我们将当前的数字添加到path中,并从nums中移除该数字。当nums为空时,我们将path添加到结果列表res中。
在主函数中,我们初始化结果列表res为空,调用dfs函数,并返回res。
用c语言dfs输出n个数的有重复全排列
下面是使用C语言实现DFS输出n个数的有重复全排列的示例代码:
```c
#include <stdio.h>
#define MAXN 10
int n;
int a[MAXN];
int vis[MAXN];
void dfs(int step)
{
if (step == n) {
for (int i = 0; i < n; ++i) {
printf("%d ", a[i]);
}
printf("\n");
return;
}
for (int i = 1; i <= n; ++i) {
if (!vis[i]) {
vis[i] = 1;
a[step] = i;
dfs(step + 1);
vis[i] = 0;
}
}
}
int main()
{
scanf("%d", &n);
dfs(0);
return 0;
}
```
在这个示例代码中,我们使用了一个数组a来存储当前的排列,使用vis数组来记录哪些数字已经被使用过了。在dfs函数中,我们先判断是否已经完成了一次排列,如果完成了,就直接输出结果并返回;否则就从1到n枚举当前位置可以放置的数字,如果这个数字还没有被使用过,就将其放入数组a中,并标记vis数组中对应的位置为已使用,然后递归调用dfs函数继续生成下一个位置的数字,最后将vis数组中对应位置的标记撤销,以便后续的排列可以使用这个数字。
需要注意的是,这个示例代码中并没有去重,也就是说,如果n个数字中有重复的数字,那么会生成重复的排列。如果需要去重,可以在dfs函数中添加一个判断,如果当前位置可以放置的数字和上一个位置放置的数字相同,就直接跳过。
阅读全文