C P1706 全排列问题

题目描述
输出自然数 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;
			}
		}

	}

}
发布了88 篇原创文章 · 获赞 27 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43457125/article/details/104365110