Exercise(16):排列组合
来源:互联网 发布:淘宝特殊类型订单删除 编辑:程序博客网 时间:2024/05/01 05:22
/* 排列组合 问题描述: 给定n个数,求出1,2,...,n的所有排列组合。 (使用深度优先搜索算法) 输入描述 InputDescription 第一行输入整数n(0<n<=100) 输出描述 OutputDescr 每行n个用空格隔开的数,表示一种排列组合 样例输入 SampleInput 3 样例输出 SampleOutput 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 问题分析: 有n个数,抽象为n个盒子,每个盒子放1~n之中的一数。 1、在盒子一里放入1、盒子二放入2、盒子三放入3. 得 组合1 (1,2,3) 2、取回:盒子三的3,盒子二的2, 放入:3放入盒子二,2放入盒子三. 得 组合2 (1,3,2) 3、取回:盒子三的2,盒子二的3,盒子一的1, 放入:2放入盒子一,1放入盒子二,3放入盒子三. 得 组合3 (2,1,3) 4、取回:盒子三的3,盒子二的1, 放入:3放入盒子二,1放入盒子三. 得 组合4 (2,3,1) 5、取回:盒子三的1,盒子二的3,盒子一的2 放入:3放入盒子一,1放入盒子二,2放入盒子三. 得 组合5 (3,1,2) 6、取回:盒子三的2,盒子二的1. 放入:2放入盒子二,1放入盒子三. 得 组合6 (3,2,1) 参照:<<啊哈!算法>> P78*/#include <iostream>using namespace std;int n=0;int arr[100] = {0};bool mark[100]; // 默认值为false void DFS(int step){ if(step==n+1) // 如果在第n+1个盒子前,表示前n个盒子已经放好数 { for(int i=1;i<=n;i++) // 打印该组合 cout<<arr[i]<<ends; cout<<endl; return; } // 放在盒子step中的数时哪个呢? // 从1~n一一尝试下 for(int i=1;i<=n;i++) { if(!mark[i]) // 判断数i是否已放置 { arr[step] = i; // 把数i放入盒子step中 mark[i] = true; // 标记数i已放置 DFS(step+1); // 再放决定下一个盒子(step+1)应放什么数 mark[i] = false; // 把刚刚尝试过的数拿出来,进行另外的尝试 } } return;}int main(){ cin>>n; // n表示n个数(1~n) if(n<=0 || n>100) return -1; DFS(1); // 从第一个盒子开始尝试 return 0;}
0 0
- Exercise(16):排列组合
- Python Exercise #16
- Exercise 16: 读写文件
- Exercise
- exercise
- Exercise
- exercise
- 排列组合
- 排列组合
- 排列组合
- 排列组合
- 排列组合
- 排列组合
- 排列组合
- 排列组合
- 排列组合
- 排列组合
- 排列组合
- Ganglia环境搭建并监控Hadoop分布式集群
- 258. Add Digits #Easy
- 范数概念
- django 购物系统 - 创建模型
- UITabbarController使用(二)隐藏和显示tabbar
- Exercise(16):排列组合
- python——时间与时间戳之间的转换
- U-Boot移植--环境变量保存位置
- Android之绘图
- 百度2016暑假实习机试题(部分)
- 访问局域网服务器中的服务
- 利用Requests爬取图片与网页数据
- LeetCode 345. Reverse Vowels of a String
- Android之动画