1 条题解
-
0
额这是本蒟蒻发的第一篇题解,请大佬、巨佬多多指教(*^_^*)(p≧w≦q) 根据题意,输入n和k,输出排列方式,如: 3 2 输出: 1 2 1 3 2 1 2 3 3 1 3 2 也就是同学们序号不能重复撒(同学们也不会分身术依~~
万一是孙悟空呢) 所以,用vis数组就行啦😜(标记数组,其他名字也可以,看懂就行) 请问,函数怎么写呢?void dfs(int k) { if (k==c+1) { for(int i=1;i<=c;i++) { cout<<a[i]<<" "; } cout<<endl; return; } for (int i=1;i<=n;i++) { if (!u[i]) { u[i]=1; a[k]=i; dfs(k+1); u[i]=0; } } }
一定要回溯!否则程序运行: 1 2; 3; 没了! dfs函数 一层一层往里搜,再看有没有满足,不能重复。 一定从1开始,还要标记,for循环就是用来找的,因为可以倒过来。 return别忘记。 下面,为您奉上代马: 哦不,是代🐎:
#include<bits/stdc++.h> using namespace std; int n,c; int a[15]; int u[15]; void dfs(int k) { if (k==c+1) { for(int i=1;i<=c;i++) { cout<<a[i]<<" "; } cout<<endl; return; } for (int i=1;i<=n;i++) { if (!u[i]) { u[i]=1; a[k]=i; dfs(k+1); u[i]=0; } } } int main() { cin>>n>>c; dfs(1); return 0; }
由于最多顶多10,可以设成11; 从一开搜; 从一开始要设置k==c+1; 好了,完结撒花!
拜拜
- 1
信息
- ID
- 2745
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 30
- 已通过
- 18
- 上传者