java全排列递归算法

Python011

java全排列递归算法,第1张

不会JAVA只能是写个C的了

#include<stdio.h>

#include<string.h>

const int MAX=10

int n

bool used[MAX]={false}

int a[MAX]

int ans[MAX]

void DFS(int deep)

{

int i

if(deep==n)

{

for(i=0i<ni++)

{

printf("%d ",ans[i])

}

puts("")

return

}

for(i=0i<ni++)

{

if(used[i])continue

used[i]=true

ans[deep]=a[i]

DFS(deep+1)

used[i]=false

}

}

int main()

{

int i

scanf("%d",&n)

for(i=0i<ni++)

{

scanf("%d",&a[i])

}

DFS(0)

return 0

}

不要急于看代码,你心理要知道全排列的思路,不注重思路是很多程序员易犯的错误。

全排列算法:

如果我求得固定第一位后的排列,那么全部排列就可以求出,固定第一位有10种可能,可以循环求得。

如果我求得固定第二位后的排列,固定第一位后的排列就可以求出,固定第二位有9种可能,可以循环求得。

。。。

如果我求得固定第10位后的排列,固定第9位后的排列就可以求出,固定第10位有1种可能,可以循环求得。

这很明显是递归的算法。

static void dfs(int start,int end,int num){//为全部排列的集合,start为数字的位置,end为最后一位,num多余的

if(start==end){//当前的数字位置为最后一位时,说明,一个序列已经生成

for(int i=1i<endi++)

System.out.print(a[i]+" ")//输出序列

System.out.println()

}

else{//序列没有生成时

for(int i=1i<endi++){

if(vis[i])//i是否在前面使用过

continue//如果是直接跳过

a[start]=i//确定start位置的数字,当start为1时就是确定第一位,有10种可能

vis[i]=true//设置i为已使用状态,避免下一位使用i

dfs(start+1,end,num)//求得确定start位后的全部序列

vis[i]=false//设置i为未使用状态

}

}