温故知新:dfs-842. 排列数字

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

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

输入格式

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

输出格式

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

数据范围

1≤n≤71≤n≤7

输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
难度:简单
时/空限制:1s / 64MB
总通过数:96065
总尝试数:121392
来源:模板题
算法标签

思路

没有想到几天之前非常熟练的模板题现在忘得差不多了,看来之前写过的题目需要复习一下hh

1.深度优先搜索:达到我们需要的要求,也就是说走到终点,我们就输出答案

    if(u>n)
    {
        for(int i=1;i<=n;i++)   printf("%d ",g[i]);
        printf("\n");
        return;
    }

2.判断每一次搜索每一个数字的状态,我们不能使用已经使用过的数字

    for(int i=1;i<=n;i++)
    {
        if(!state[i])
        {
            state[i]=true;
            g[u]=i;
            dfs(u+1);
            state[i]=false;
            g[u]=0;
        }
    }

并且循环需要从1开始使用,因为我们使用的数字是从1开始使用的

先修改数字的状态,然后把相应的数字存到我们需要输出的路径数组里面,然后递归调用函数本身,然后恢复现场,把原来的状态恢复

3.代码细节是输出的时候下标是i,刚刚手残写成了g[N],输出很大的数字,非常奇怪的bug

        for(int i=1;i<=n;i++)   printf("%d ",g[i]);

4.万能头文件在acwing上运行时间(这道题目) 是9ms,iostream是11ms,是啥情况

代码

#include
using namespace std;

int n;
const int N=10;
int g[N];
bool state[N];

void dfs(int u)
{
    if(u>n)
    {
        for(int i=1;i<=n;i++)   printf("%d ",g[i]);
        printf("\n");
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(!state[i])
        {
            state[i]=true;
            g[u]=i;
            dfs(u+1);
            state[i]=false;
            g[u]=0;
        }
    }
}

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

 

你可能感兴趣的:(温故知新,深度优先,算法,数据结构)