| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1211 人关注过本帖
标题:请问下面代码中v[i]=0是什么时候执行的,深搜回朔是怎么实现的
只看楼主 加入收藏
huangmeixin
Rank: 2
等 级:论坛游民
帖 子:13
专家分:20
注 册:2018-11-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
请问下面代码中v[i]=0是什么时候执行的,深搜回朔是怎么实现的
//代码的功能为输出全排列
#include<iostream>
using namespace std;
int n,a[100],v[100];
//a数组用于保存每一次的排列,v数组用于判断数字是不是已经被选过
void dfs(int dp)//dp从1到n,执行n次,每次选择一个数
{
    if(dp>n)//dp为n+1的时候,就说明已经选了n个,可以输出了;
    {
        for(int i=1;i<=n;i++)
        {
            cout<<a[i]<<" ";
        }
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(!v[i])//判断是不是选择过
        {
            a[dp]=i;//保存当前选择
            v[i]=1;//标记这个数字,防止同一个排列选择相同的数字。
            dfs(dp+1);
            v[i]=0;//回溯回来的时候一定要清楚标记,不然下一个排列就能选择了,这也是最关键的地方,仔细思考一下。
        }
    }
}
int main()
{
    while(cin>>n)
    {
        dfs(1);
    }
}
搜索更多相关主题的帖子: 代码 执行 排列 int 选择 
2018-12-24 23:56
莱茵瓶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:32
专家分:103
注 册:2018-10-30
收藏
得分:20 
程序代码:
dp=1
for(int i=1;i<=n;i++)
{
if(!v[i])
{
    a[1]=i;
    v[i]=1;
    dfs(
        dp=2
        for(int i=1;i<=n;i++)
        {
            if(!v[i])
            {
                a[2]=i;
                v[i]=1;
                dfs(
                    dp=3
                    for(int i=1;i<=n;i++)
                    {
                        if(!v[i])
                        {
                            a[3]=i;
                            v[i]=1;
                            dfs(
                                dp=4
                                输出a[1]-a[n]
顶。我也想知道,阶乘的递归我理解,可是换成这个我有点绕不过来,执行顺序不是上面这样吗,最后怎么实现全排列的,希望有人可以详细解答一下
2018-12-25 16:57
莱茵瓶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:32
专家分:103
注 册:2018-10-30
收藏
得分:0 
单步调试运行了,我还是不理解啊...
2018-12-28 11:02
快速回复:请问下面代码中v[i]=0是什么时候执行的,深搜回朔是怎么实现的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018038 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved