洛谷题解洛谷题解题解:P10448 组合型枚举
xyx404
思路:
使用 dfs 算法,创建一个数组存当前已经找到的数字。
深度优先搜索代码实现:传入的量为现在找的是第几个数,第一次传入的是一,表示现在找的是第一个数,当传入的数减一等于 m 时输出。
输出函数实现:循环定义的 i 表示当前已经找到的数字的数组的下标,如果你下标是从零开始存的就从零历遍到 m−1,如果是从一开始存的就从 1 历遍到 m,注意不要忘了最后换行。
因为题目中要求字典序较小的排在前面,所以我们就不定义标记数组了,下一次搜索就直接从上一个数加一开始。
完整代码:
#include<bits/stdc++.h> using namespace std; #define LL long long #define itn int #define ull unsigned long long ull n,m; ull sc[30]; void print(){ for(int i=1;i<=m;i++)cout<<sc[i]<<" "; cout<<"\n"; } void dfs(int x){ if(x-1==m){ print();return ; } for(int i=sc[x-1]+1;i<=n;i++){ sc[x]=i; dfs(x+1); } } int main(){ cin>>n>>m; dfs(1); return 0; }
|