1750:全排列

发布于:2023-01-12 ⋅ 阅读:(536) ⋅ 点赞:(0)

预计阅读时间:5分钟

原题

描述

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。 

输入

输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

输出

输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:

已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。

样例输入

abc

样例输出

abc
acb
bac
bca
cab
cba

思路

使用dfs即可。关于dfs如何使用,请阅读我的关于dfs的讲解文章。

深度优先搜索(DFS)_Hacket_徐的博客-CSDN博客深度优先搜索(Depth First Search),是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件)。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。...https://blog.csdn.net/weixin_46522531/article/details/126353591?spm=1001.2014.3001.5501vis里存的是当前字母有没有使用,p里存的是当前组合。从0到len一次放置每一个字母,直到全部放完,就是一个解,还得找更多解。

代码

#include<iostream>
#include<string.h>
using namespace std;
const int maxn=8;
char a[maxn];
char p[maxn];
bool vis[maxn]={false};
int len=0;
void dfs(int x)
{
	if(x==len)
	{
		cout<<p<<endl;
		return;
	}
	else
	{
		for(int i=0; i<len; i++)
		{
			if(!vis[i])
			{
				vis[i]=true;
				p[x]=a[i];
				dfs(x+1);
				vis[i]=false;
			}
		}
	}
}
int main()
{
	cin>>a;
	len=strlen(a);
	dfs(0);
	return 0;
}

希望本博客对大家有所帮助


网站公告

今日签到

点亮在社区的每一天
去签到