报价网站系统,wordpress 律所,长沙网站搭建公司联系方式,大连网站建设是什么目录
题目链接#xff1a;
思路#xff1a;
代码#xff1a; 题目链接#xff1a;
P1706 全排列问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路#xff1a; 如果n比较小#xff0c;可以写n个for循环输出全排列。但是这种简单方法只能用于较小的n#xff0…目录
题目链接
思路
代码 题目链接
P1706 全排列问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 如果n比较小可以写n个for循环输出全排列。但是这种简单方法只能用于较小的n如果n比较大这种方法的代码非常冗长、难看。 DFS非常适合实现全排列代码清晰、简洁、优美。下面的C代码能从小到大打印排列。 源自罗老师的博客蓝桥杯软件赛零基础备赛20周--第12周--DFS基础必考-CSDN博客 可以画二叉树来帮助理解。 代码
#includebits/stdc.h
using namespace std;
int n;
int vis[10]; // 访问标记
int a[10]; //需要做全排列的数组
int b[10]; //当前DFS得到的全排列
void dfs(int step) {if (step n1) { //已经对n个数做了全排列输出全排列for (int i1; in; i){printf(%5d,b[i]);}printf(\n); //调试了才知道为什么这么写输出三个数字后换行退出然后进入下面那个遍历a[i]的for循环中return; //结束不再继续DFS}for (int i 1; i n; i) { //遍历每个a[i]放进全排列中if (vis[i] 0) { // 数字a[i]不在前面得到的排列中b[step] a[i]; // 把a[i]放进排列vis[i] 1; // 保存现场a[i]不能在后面继续用dfs(step1); // 继续把后面的数放进排列vis[i] 0; // 恢复现场a[i]重新可以使用}}return;
}
int main() {cin n;for (int i1; in; i) a[i]i; //赋值得到n个数dfs(1); //对a[1]~a[n]做全排列return 0;
}输出部分排列 上述代码是打印n个数的全排列如果需要打印n个数中任意m个数的排列略作修改即可。例如n4m3修改C代码这两处第8行把stepn1改为stepm1第9行in改为im。 源自罗老师的博客蓝桥杯软件赛零基础备赛20周--第12周--DFS基础必考-CSDN博客 多调试了解计算机走的每一步。