NYOJ 19 擅长排列的小明(dsf STL——next_permutation函数)
2015-07-02 19:25
429 查看
擅长排列的小明
时间限制:1000 ms | 内存限制:65535 KB难度:4
描述 小明十分聪明,而且十分擅长排列计算。比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长。现在需要你写一个程序来验证擅长排列的小明到底对不对。
输入第一行输入整数N(1<N<10)表示多少组测试数据,
每组测试数据第一行两个整数 n m (1<n<9,0<m<=n)输出在1-n中选取m个字符进行全排列,按字典序全部输出,每种排列占一行,每组数据间不需分界。如样例样例输入
2 3 1 4 2
样例输出
1 2 3 12 13 14 21 23 24 31 32 34 41 42 43
有两种解法。
1,STL—next_permutation函数
#include<iostream> #include<algorithm> #include<string> using namespace std; int main() { int n,m,i,t; cin>>t; while(t--) { cin>>n>>m; string s1,s2;//每次都要初始化 for(i=0;i<n;i++) s1+='0'+i+1;//将字符的每一位赋初值 s2=s1.substr(0,m);//截取字符s1,从0到m的位置复制到s2 cout<<s2<<endl; while(next_permutation(s1.begin(),s1.end()))//对s1进行全排列,从开头到接尾。s1.begin()开始s1.end()结尾 { if(s2!=s1.substr(0,m))//判断是否截取和排列后的前y是否一样 { s2=s1.substr(0,m); cout<<s2<<endl; } } } return 0; }
2.dsf深搜。
无奈,表示还是不会做搜索题,一碰到就跪。抓狂ing。。。。
还好,经过几次看大牛代码,用Dev调试的经历。发现深搜递归就是一个不断深入,碰到特定的条件开始回溯或回溯后有不断深入的过程。这么说肯定不懂,因为老普当时也是这么跟我说的,我没懂。个人心得:学习递归时可以拷贝大牛代码,使用编译器调试,一步一步的看递归过程。(当然智商好的就不用了,人家一眼就看懂了)。
搜索题还需多练。
具体代码如下:
#include<stdio.h> bool sign[10]; int a[10],n,m; void dfs(int k) { int i; if(k==m) { for(i=0;i<k;i++) printf("%d",a[i]); printf("\n"); return; } for(i=1;i<=n;i++) { if(!sign[i]) { a[k]=i; sign[i]=1; dfs(k+1); sign[i]=0; } } } int main() { int t,i; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) sign[i]=0; dfs(0); } return 0; }
相关文章推荐
- 计算几何基本知识整理
- QDataStream对QVector的序列化
- TCP 组播 广播
- Spyder常用环境working directory设置
- poj 3616 奶牛产奶时间间隔dp
- 读博分析
- OC - 类目、延展、协议
- java学习06--比较运算符和逻辑运算符
- 【Web探索之旅】第四部分:Web程序员
- Nginx 在windows下配合iis搭建负载均衡过程
- android开发,设置listview的高度无效
- MYSQL远程访问设置
- 解读Cardinality Estimation算法(第三部分:LogLog Counting)
- iOS9适配系列教程
- iOS9适配系列教程
- 【Web探索之旅】第三部分第三课:协议
- AMD Geode GX processor L1 DCache扩容验证方法
- mysql重连,连接丢失:The last packet successfully received from the server
- SIFT算法
- 【学习笔记】【C语言】条件编译