递归打印组合数、搜索模板
- //从后往前选取,选定位置i后,再在前i-1个里面选取m-1个。
- //如 1 2 3 4 5 中选取 3 个
- //1、选取5后,再在前4个里面选取2个,而前4个里面选取2个又是一个子问题,递归即可。
- //2、如果不包含5,直接选定4,那么再在前3个里面选取2个,而前三个里面选取2个又是一个子问题,递归即可。
- //3、如果也不包含4,直接选取3,那么再在前2个里面选取2个,刚好只有两个。
- //纵向看,1、2、3刚好是一个for循环,初值为5,终值为m
- //横向看,该问题为一个前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; }
迷宫搜索类题目模板