X-man

导航

递归打印组合数、搜索模板

 

  1. //从后往前选取,选定位置i后,再在前i-1个里面选取m-1个。  
  2. //如 1 2 3 4 5 中选取 3 个  
  3. //1、选取5后,再在前4个里面选取2个,而前4个里面选取2个又是一个子问题,递归即可。  
  4. //2、如果不包含5,直接选定4,那么再在前3个里面选取2个,而前三个里面选取2个又是一个子问题,递归即可。  
  5. //3、如果也不包含4,直接选取3,那么再在前2个里面选取2个,刚好只有两个。  
  6. //纵向看,1、2、3刚好是一个for循环,初值为5,终值为m  
  7. //横向看,该问题为一个前i-1个中选m-1的递归。  
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
# define MAXN 100
int a[MAXN];
void comb(int m, int k)
{
    int i, j;
    if(k<1)
    {
        for (j=a[0]; j>0; j--)//a[a[0]],……,a[1]
                printf("%4d",a[j]);
        printf("\n");
        return ;
    }
    for (i = m; i >= k; i--)
    {
        a[k] = i;
        comb(i - 1, k - 1);
    }
}
int main()
{
    int k=4;
    int m=5;
    a[0] = k;
    comb(m,k);//a[0]保持输出的个数
    return 0;
}

打印排列数:

#include<stdio.h>
#include<string.h>
int n,m, a[10];
bool bz[10];//标记数字是否已经被用过
void DFS(int k)
{
    if (k==n)//搜出来的长度等于要求的长度,输出该序列,由于是从小到大搜索的所以输出的时候也是从小到大的
    {
        for (int i=0; i<n; i++)
            printf("%d",a[i]);
        printf("\n");
        return ;
    }
    for (int i=1; i<=m; i++)//不等于要求的长度,继续添加数
    {
        if ( !bz[i] )
        {
            a[k]=i;//将搜索到的数存起来
            bz[i]=true;//标记为已访问
            DFS(k+1);//搜索下一个数
            bz[i]=false;//上一个序列搜索完之后,重新标记为未访问
        }
    }
}

int main()
{
    int _case;
    scanf("%d",&_case);
    while(_case--)
    {
        scanf("%d %d",&m,&n);
        memset(bz,false,sizeof(bz));
        DFS(0);//从第一位开始搜索
    }
    return 0;

}

 

 

 迷宫搜索类题目模板

 

posted on 2017-08-15 14:21  雨钝风轻  阅读(194)  评论(0编辑  收藏  举报