AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 842. 排列数字    原题链接    简单

作者: 作者的头像   Ni ,  2019-10-26 20:57:13 ,  所有人可见 ,  阅读 2064


8


3

排列数字可以说是最基础的DFS了
第一次接触的时候还是在《啊哈 算法》那本书里
不过那时候才刚上大学什么都不懂
现在再写这题才真正理解

C++ 代码

#include<iostream>
using namespace std;

int n;      //需要搜索的个数
const int N=10;

int path[N];    //path[]用于保存路径
bool st[N];     //用于记录 该步是否已经走过

void dfs(int u)
{
    if(u==n)        //一条路搜索完成
    {
        for(int i=0;i<n;i++)  //输出结果
        {
            cout<<path[i]<<' ';
        }
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++)     //未搜素完成则继续尝试 即一条走到底为止
    {
        if(!st[i])
        { 
            st[i]=true;     //标记当前步防止重复
            path[u]=i;   //保存当前路径
            dfs(u+1);   //进行下一步搜索
            st[i]=false;    //恢复现场 否则会影响下一条路的搜索
            path[u]=0;

        }
    }

}
int main()
{
    cin>>n;
    dfs(0);         //从第0个位置开始搜索
    return 0;
}

8 评论


用户头像
送你一朵小红花   2022-01-21 23:04         踩      回复

还是不懂咋回溯的,12咋到13的

用户头像
ym.   2022-03-29 10:47      2    踩      回复

第一条路输出123后,它会回到for循环(i = 3),然后将3标记去除,for循环结束,回到上一个for循环,将2的标记去掉,此时i=2,for循环没有结束,会进行下一次for循环即i=3;然后重点来了,此时的u=1,i=3,它会去确定第2位,而i=3,即13;建议结合搜索树看

用户头像
代码能不能一遍过啊   2022-04-04 20:31    回复了 ym. 的评论         踩      回复

卧槽,终于懂了

用户头像
ym.   2022-04-04 22:26    回复了 代码能不能一遍过啊 的评论         踩      回复

完了, 我来复习了hh

用户头像
冰块西北风   2022-04-17 22:03    回复了 ym. 的评论         踩      回复

tql

用户头像
120_9   2022-11-11 19:38    回复了 ym. 的评论         踩      回复

懂了懂了,重点部分模拟了下就懂了,感谢

用户头像
宇宙.ක   2024-01-21 21:27    回复了 ym. 的评论         踩      回复

请问回到i= 3的时候它的标记是怎么去掉的呢


用户头像
Kelper   2021-01-24 14:44         踩      回复

写的不错


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息