深度优先搜索之1-9中的数字全排列
输入3
输出
123
132
213
231
312
321
#include<stdio.h>
int a[10],book[10],n;/*C语言的全局变量在没有赋值以前默认为0,因此这里的book数组不用全部再次赋初始值0*/
void dfs(int step)//step表示要排列的位置
{
int i;
if(step==n+1)//如果要排列第n+1个位置,那么表示前n个盒子已经放好数字
{
//输出一种排列(第1-n位置上的数字的序号)
for(int i=1; i<=n; i++)
printf("%d",a[i]);
printf("\n");
return ;//返回之前的一步(最后一次调用电dfs的地方)
}
//按照1.2.3...n的顺序一一尝试应该放放入数字
for(int i=1; i<=n; i++)
{
//判断要排列的数字是否已经排好了
if(book[i] == 0)//标记,等于0的时候表示没有排好
{
//开始尝试排列数字i
a[step] = i;//将第i个数字放入到底step位置上
book[i] = 1;//book[i]等于1,表示排好了
//第step位置已经排好,然后排第i+1个位置
dfs(step+1);//通过函数的递归调用实现
book[i] = 0;//将刚才尝试的数字收回,才能进行下一次尝试
}
}
return ;
}
int main()
{
scanf("%d",&n);//输入的时候要注意n为1-9之间的整数
dfs(1);//首先准备对第一个位置进行排列
getchar();
return 0;
}
组合数
时间限制:3000 ms | 内存限制:65535 KB
难度:3
-
描述
- 找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
-
输入
- 输入n、r。 输出
- 按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入 -
5 3
样例输出 -
543 542 541 532 531 521 432 431 421 321
代码:
#include<stdio.h>
int a[15];
int n,r;
void dfs(int c,int s)
{
if(s == r+1)
{
for(int j=1; j<=r; j++)
printf("%d",a[j]);
printf("\n");
return ;
}
for(int i=c; i>0; i--)
{
a[s]=i;
dfs(i-1,s+1);
}
return ;
}
int main()
{
scanf("%d%d",&n,&r);
dfs(n,1);
return 0;
}
参考资料《啊哈,算法》