搜索。深搜学习。深度优先搜索之数字全排列。nyoj,组合数

深度优先搜索之1-9中的数字全排列

输入

输出 
123
132
213
231
312
321
#include
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、r。
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3
样例输出
543
542
541
532
531
521
432
431
421
321

代码:

#include
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; 
}



参考资料《啊哈,算法》

你可能感兴趣的:(------搜索------)