您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: