您的位置:首页 > 其它

nyoj19 擅长排列的小明

2014-11-04 16:11 399 查看
关键字:搜索、回溯、n层循环的实现

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

 参考http://blog.csdn.net/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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息