842. 排列数字
给定一个整数 n,将数字1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围:
1≤n≤7
输入样例:
3
输出样例:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
#include<stdio.h> #define N 8 int n; int std[N]; int used[N]; void dfs(int u){ if(u>n){ for(int i=1;i<=n;i++){ printf("%d ",std[i]); } printf("\n"); } for(int i=1;i<=n;i++){ if(used[i]==0){ std[u]=i; used[i]=1; dfs(u+1); std[u]=0; used[i]=0; } } } int main(){ scanf("%d",&n); dfs(1); for(int i=1;i<=n;i++){ used[i]=0; } return 0; }
92. 递归实现指数型枚举
从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数 n。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤15
输入样例:
3
输出样例:
3 2 2 3 1 1 3 1 2 1 2 3
#include<stdio.h> #define N 16 int n; int std[N];//表示当前状态,0表示未确定,1表试未选,2表示选 void dfs(int u){ if(u>n){ for(int i=1;i<=n;i++){ if(std[i]==2){ printf("%d ",i); } } printf("\n"); return ; } std[u]=2; dfs(u+1); std[u]=0; std[u]=1; dfs(u+1); } int main() { scanf("%d",&n); dfs(1); return 0; }