nyoj19 擅长排列的小明

本文介绍了两种实现N层循环的方法:非递归和递归方式,并通过具体代码示例展示了如何进行多层循环的控制与遍历。适用于解决组合、搜索等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键字:搜索、回溯、n层循环的实现

 参考《任意N重循环的设计方法与应用_肖建华》

 参考http://blog.youkuaiyun.com/whjkm/article/details/38498317

程序 :1 n重循环非递归程序框架
#define N 100
void n_circle(int n, int *LEFT, int *RIGHT, int *STEP )
{
    int a[N+1];
    int i,k;
    for(i=1; i<=n; i++)
        a[i]=LEFT[i];
    k=n;
    while(k>=1)
    {
        { }循环体内处理软件
        while(a[k]+STEP[K]>RIGHT[k])
        {
            a[k]=LEFT[k];
            k--;
        }
        if(k==0) continue;//该处也可为break;
        a[k]+=STEP[K];
        k=n;
    }
}

程序 :2 n重循环递归程序框架
#define N 100
int LEFT[N+1],RIGHT[N+1],STEP[N+1];
int a[N+1];
void recursion_circle(int n, int i )
{
    int k;
    if(i<n)
    {
        i++;
        for(a[i]=LEFT[i]; a[i]<=RIGHT[i]; a[i]+=STEP[i])
            recursion_circle(n,i);
    }
    else
        {循环体内语句;
    }
}

我的代码:

#include <iostream>

#include<cstdio>

#include<cstring>

const int maxn=10;

int ans[maxn];//最终结果保存在这个数组

int state[maxn];//状态标记 未访问的为0

int n,m;

using namespace std;

void dfs(int pos);

int main()

{

   //freopen("D:\\acm.txt","r",stdin);

   int N;

   scanf("%d",&N);

   while(N--)

    {

       memset(state,0,sizeof(state));

       scanf("%d %d",&n,&m);

       dfs(1);

    }

   return 0;

}

void dfs(int pos)//n层循环的递归框架

{

   if(pos==m+1)

    {

       for(int i=1; i<=m; i++)

           printf("%d",ans[i]);

       printf("\n");

       return;

    }

   for(int i=1; i<=n; i++)

    {

       if(state[i]==0)

       {

           ans[pos]=i;

           state[i]=1;

           dfs(pos+1);

           state[i]=0;//回溯(可以注释下看看结果)

       }

    }

   return;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值