DFS(2)

void DFS(int k)  //处理第k步
{    for (int i=1;i<=m;i++)  //第k步中有m种可能
     {   //处理第k步 
          if(k==n) //已经处理完n步,到达目的状态  
           {   //输出结果;       
               return;       
           }
         DFS(k+1);//进入第k+1步
     }
}

例题1:还是从1-m中取n个数,允许重复

#include<iostream>
using namespace std;
const int MAX=40;
int m,n,a[MAX];
void DFS(int cur)
{   for(int i=1;i<=m;i++)
    {  a[cur]=i;
       if(cur==n)
       {  for(int j=0;j<n;j++)
            cout<<a[j]<<" ";
          cout<<endl;
          return ;//只需注意return ;即可
       }
       DFS(cur+1);
    }
}
int main()
{   cin>>m>>n;
    DFS(0);
    return 0;
}

例题2:取的这n个数不允许重复(和第一个DFS模板没有什么区别~~~~)

#include<iostream>
using namespace std;
const int MAX=40;
int m,n,a[MAX],visit[MAX];
void DFS(int cur)
{   for(int i=1;i<=m;i++)
    {  if(!visit[i])
       {  a[cur]=i;
          if(cur==n)
          {  for(int j=0;j<n;j++)
               cout<<a[j]<<" ";
             cout<<endl;
             return ;
          }
          visit[i]=1;
          DFS(cur+1);
          visit[i]=0;
       }
    }
}
int main()
{   cin>>m>>n;
    DFS(0);
    return 0;
}

例题3:不允许重复且只能从小到大

#include<iostream>
#include<cstring>
using namespace std;
const int MAX=40;
int n,m,a[MAX];
void DFS(int cur)
{   for(int i=a[cur-1]+1;i<=m-n+cur;i++)
    { a[cur]=i;
      if(cur==n+1)
      {  for(int i=1;i<=n;i++)
           cout<<a[i]<<" ";
         cout<<endl;
         return ;
      }
      DFS(cur+1);  
    }
}
int main()
{   cin>>m>>n;
    DFS(1);
    return 0;
}

 


 

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值