组合数 南阳oj32【DFS】

描述
找出从自然数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>
#include<string.h>
int m,n;
int vis[20];
int res[20];
int arr[20];
void DFS(int a,int b,int step)
{
	if(a>m+1) return ;
	if(step==n+1)
	{
		for(int i=1;i<n;++i)
			printf("%d",res[i]);
		printf("%d\n",res[n]);
		return ;
	}
	res[b]=arr[a];
	DFS(a+1,b+1,step+1);

	DFS(a+1,b,step);
}
int main()
{
	while(~scanf("%d%d",&m,&n))
	{
		int j=0;
		for(int i=m;i>=1;--i)
		{
			arr[++j]=i;
		}
		DFS(1,1,1);
	}
	return 0;
}
#include <stdio.h>
#include<string.h>
int m,n;
int vis[20];
int res[20]={100};
void DFS(int step)
{
	if(step==n+1)
	{
		for(int i=1;i<n;++i)
			printf("%d",res[i]);
		printf("%d\n",res[n]);
	}
	for(int i=m;i>=1;--i)
	{
		if(!vis[i]&&i<res[step-1])
		{
			res[step]=i;
			vis[i]=1;
			DFS(step+1);
			vis[i]=0;
		}

	}
}
int main()
{
	while(~scanf("%d%d",&m,&n))
	{
		memset(vis,0,sizeof(vis));
		DFS(1);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 02:47:25

组合数 南阳oj32【DFS】的相关文章

nyoj 32 组合数【简单dfs】

组合数 时间限制: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> #include<string.

深度搜索入门

深度优先搜索是搜索的手段之一.它从某个状态开始,不断地转移状态,直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此重复,直到找到最终的解. 做这类题目,抓住两样东西:1.总体上递归几次(几层)?每一次递归确定一层上的数. 2.每次递归,有几种选择的情况.所以dfs()函数,只有两部分(if.else结构):1.(if部分)若每一层都选择了,判断是否符合条件,做出题目要求的操作.2.(else部分)若还有层没有选择,就做出选择,所有选择的情况列出. 下面是几个考察dfs的题目: 1.部

算法笔记_108:第四届蓝桥杯软件类省赛真题(JAVA软件开发本科A组)试题解答

 目录 1 世纪末的星期 2 振兴中华 3 梅森素数 4 颠倒的价牌 5 三部排序 6 逆波兰表达式 7 错误票据 8 带分数 9 剪格子 10 大臣的旅费 前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~ 1 世纪末的星期 标题: 世纪末的星期 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如果是星期一则会.... 有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 于是,"谣言制造商&qu

组合数(dfs)

组合数 时间限制: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 1 #include<stdio.h> 2 #include<str

南阳32--组合数(Dfs)

组合数 时间限制: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 来源 [苗栋栋]原创 上传者 苗栋栋 ac: 1 #include <cmath

南阳19--擅长排列的小明(Dfs)

时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长.现在需要你写一个程序来验证擅长排列的小明到底对不对. 输入 第一行输入整数N(1<N<10)表示多少组测试数据,每组测试数据第一行两个整数 n m (1<n<9,0<m<=n) 输出 在1-n中选取m个字符进行全排

组合数的简单求法(dfs)

组合数的具体应用可以参考这个例子:https://www.cnblogs.com/FengZeng666/p/10496223.html 下面这段代码可以作为求组合数的固定套路或者公式: 1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 int sum = 0; 7 int a[1000]; 8 9 void dfs(int step, int n, int m) //从n个数里面选出m个,存

递归基础—组合数 / 排列数—输出的各种办法(dfs/递归/bfs)

B: 部分和问题***(注意部分和 ! = 任意子区间求和不一样) 描述   给你N个数,问你能不能从其中取出一些,让它们的和为K. 输入 第一行包括两个数,N,K,分别代表数字个数,以及和为K. 接下来N行,每行一个数字. 输出 如果能选出一些数和为K, 输出YE5,  否则,输出N0 样例 输入: 4 0 1 -1  2  3 输出: YE5 输入: 2 2 1 -3 输出: N0 本题求组合数和,注意pe之外,思维比较基础,办法很多,以下为利用dfs思想实现的一种办法 如果求组合数输出各种

南阳722--数独(Dfs)

数独 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个3*3宫内的数字均含1-9,不重复. 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的. 有一天hrdv碰到了一道号称是世界上最难的数独的题目,作为一名合格的程序员,哪能随随便便向困难低头,于是他决定编个程序来解决它.. 输入 第一行有一个