题目描述
输出自然数 11 到 nn 所有不重复的排列,即 nn 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 nn。
输出格式
由 1 \sim n1∼n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 55 个场宽。
输入输出样例
输入 #1
3
输出 #1
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include<stdio.h>
int a[10],b[10],n;
void dfs(int step) //深搜 模板
{
if(n+1==step) // 如果发完号码
{
for(int i=1;i<=n;i++)
printf("%5d",a[i]); // 经典深搜样式
printf("\n");
return ;
}
for(int i=1;i<=n;i++)
{
if(b[i]==0)
{
a[step]=i; //给第step个人第 i 号号码牌
b[i]=1; //标记已经发过
dfs(step+1); //递归继续搜
b[i]=0; //搜完就清零
}
}
return;
}
int main()
{
scanf("%d",&n);
dfs(1); // 从1开始搜
return 0;
}
用java 第二个 TLE 纳闷了 !!!!!!!!
import java.util.*;
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.handleInput();
}
int n = 0;
int[] a = new int[10];
int[] b = new int[10];
public void handleInput() {
Scanner in = new Scanner(System.in);
if (in.hasNext()) {
n = in.nextInt();
}
in.close();
dfs(1);
}
public void dfs(int step) {
if (step == n + 1) {
for (int i = 1; i <= n; i++) {
System.out.printf("%5d", a[i]);
}
System.out.println();
return;
}
for (int i = 1; i <= n; i++) {
if (b[i] == 0) {
a[step] = i;
b[i] = 1;
dfs(step + 1);
b[i] = 0;
}
}
}
}