NYOJ 19 擅长排列的小明(dsf STL——next_permutation函数)

来源:互联网 发布:诱导交友app源码 编辑:程序博客网 时间:2024/05/20 06:41

擅长排列的小明

时间限制:1000 ms  |            内存限制:65535 KB
难度:4
描述
小明十分聪明,而且十分擅长排列计算。比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长。现在需要你写一个程序来验证擅长排列的小明到底对不对。
输入
第一行输入整数N(1<N<10)表示多少组测试数据,
每组测试数据第一行两个整数 n m (1<n<9,0<m<=n)
输出
在1-n中选取m个字符进行全排列,按字典序全部输出,每种排列占一行,每组数据间不需分界。如样例
样例输入
23 14 2
样例输出
123121314212324313234414243

 

 

有两种解法。

 

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的位置复制到s2cout<<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;}


 

 

1 0
原创粉丝点击