#include #include #includeusingnamespace std;constint N &#61;16;int n; int status[N];//0 表示未使用 1表示选中 2表示未选中voiddfs(int u) {if(u > n)//判断边界{for(int i &#61;1; i <&#61; n; i &#43;&#43;){if(status[i]&#61;&#61;1) cout<<i<<" ";}puts("");return;//一定要结束}status[u]&#61;1;dfs(u&#43;1);status[u]&#61;0;status[u]&#61;2;dfs(u&#43;1);status[u]&#61;0; }intmain() {cin>>n;dfs(1);return0; }
94. 递归实现排列型枚举
#include #include #includeusingnamespace std;constint N &#61;10;int n; int sta[N];//表示位置 0 未使用 1 ~ n 放了数 bool used[N];//默认是0 0 是未使用 1 是已使用voiddfs(int u) {if(u > n){for(int i &#61;1; i <&#61; n;i&#43;&#43;)printf("%d ",sta[i]);puts("");return;}for(int i &#61;1; i <&#61; n; i &#43;&#43;)//遍历枚举分支 因为有多个分支{if(!used[i]){used[i]&#61;true;sta[u]&#61;i;//把该数放入dfs(u&#43;1);used[i]&#61;false;//恢复现场sta[u]&#61;0;}} }intmain() {cin>>n;dfs(1);return0; }
93. 递归实现组合型枚举
#include #include #includeusingnamespace std;constint N &#61;30;int n,m; int sta[N];voiddfs(int u,int start) {if(u&#43;n-start <m)return;//剪枝if(u&#61;&#61;m&#43;1)//u 从1开始 到 m&#43;1 刚好是 m 个数{for(int i &#61;1; i <&#61; m; i &#43;&#43;)printf("%d ",sta[i]);puts("");return;}for(int i &#61; start; i <&#61; n; i &#43;&#43;){sta[u]&#61;i;dfs(u&#43;1,i&#43;1);sta[u]&#61;0;//恢复现场} }intmain() {cin>>n>>m;dfs(1,1);return0; }
#includeusingnamespace std;constint N &#61;10;int n, ans; bool st[N];//记录是否使用 bool backup[N];//备份数组boolcheck(int a,int c)//求 b 的值&#xff0c;并且判断没有重复 而且和符合要求 {longlong b &#61; n *(longlong)c - a * c;if(!a ||!b ||!c)//都不为0returnfalse;memcpy(backup, st,sizeof st);//复制数组while(b){int x &#61; b %10;//取个位数b /&#61;10;//缩小if(!x || backup[x])//判断 x 是否为0 或是 x 是否被用过returnfalse;backup[x]&#61;true;}for(int i &#61;1; i <&#61;9; i&#43;&#43;)//看b 有没有重复的if(!backup[i])returnfalse;returntrue; }voiddfs_c(int u,int a,int c) {if(u >9)//如果十个数都用了return;if(check(a, c))//看是否符合要求ans&#43;&#43;;for(int i &#61;1; i <&#61;9; i&#43;&#43;){if(!st[i]){st[i]&#61;true;dfs_c(u &#43;1, a, c *10&#43; i);st[i]&#61;false;//恢复现场}} }voiddfs_a(int u,int a) {if(a >&#61; n)//这不是边界return;if(a)dfs_c(u, a,0);for(int i &#61;1; i <&#61;9; i&#43;&#43;){if(!st[i]){st[i]&#61;true;dfs_a(u &#43;1, a *10&#43; i);st[i]&#61;false;}} }intmain() {cin >> n;dfs_a(0,0);//第一个表示当前位置 第二个是a的值cout << ans << endl;return0; }