48、【图】排列数字——DFS(C/C++版)

题目描述

给定一个整数 n,将数字 1∼n排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

输入格式

共一行,包含一个整数 n。

输出格式

按字典序输出所有排列方案,每个方案占一行。

数据范围

1≤n≤7

输入样例:

3

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

题目分析

题目是找出N个数字的排列组合情况,可使用类似于DFS的方式,选取以种情况后不断地向深处扩展,找到所有情况后,回退,再去找另一种情况。
48、【图】排列数字——DFS(C/C++版)_第1张图片

算法实现

#include <stdio.h>

const int N = 7;
int n, path[N];     // path[i]:存储排列数的情况
bool visit[N];      // 记录哪些点已经被访问过

void dfs(int u){
     
    if(n == u){
     
        for(int i = 0; i < n; i++)      printf("%d ", path[i]);
        puts("");
        return ;
    }

    for(int i = 1; i <= n; i++){
     
        if(!visit[i]){
               // 防止下次递归时二次记录     
            path[u] = i;        // 将数字i记录在path中
            visit[i] = true;    // 标记数字i已被访问过
            dfs(u + 1);         // 向下访问下一个数
            visit[i] = false;   // 每次所有情况访问完后,依次将记录标记为fasle,返回到顶点进行下一种情况的遍历
        }

    }
}

int main(){
     
    scanf("%d", &n);
    dfs(0);
    return 0;
}

你可能感兴趣的:(算法刷题,数据结构,图论,dfs)