字母全排列 ≈ 数字全排列
2024-08-09 21:32:06
发布于:上海
7阅读
0回复
0点赞
该题目与 A7989.全排列问题 类似
若该字符串长度为 len
实质是将 自然数 1 到 len 的所有数字不重复的排列,即 len 的全排列,
输出 该字符串中按每一个全排列顺序排列的新字符串
#include<bits/stdc++.h>
using namespace std ;
string s ; // 输入的字符串
bool vis[10] ; // 记录这一位在这个排列中是否被用过
int l , a[10] ; // 字符串长度;记录不同排列
void dfs(int x){
if(x == l+1){ // 这个排列已完成
for(int i = 1 ; i <= l ; i++){
cout << s[a[i]-1] ;
}
cout << endl ;
return ;
}
for(int i = 1 ; i <= l ; i++){
if(!vis[i]){ // 这一位在这个排列中没有被用过
a[x] = i ; // 记录这一位
vis[i] = true ; // 用过了,记录
dfs(x + 1) ; // 进行下一位的排列
vis[i] = false ; // 回归原始状态,准备进行下一组排列
}
}
}
int main(){
cin >> s ;
l = s.size() ; //或 l=s.length()
dfs(1) ; // 从第一位开始深搜
return 0 ;
}
下方附赠 A7989.全排列问题的题解,果然两道题基本一样
#include<bits/stdc++.h>
using namespace std ;
//深搜题
int n ; // 定义全局变量
int a[11] ; // 记录不同的排列
bool vis[11] ; // 记录该数字在这个排列中是否被用过
void dfs(int x){
if(x == n + 1){ // 如果此时已完成排列
for(int i = 1 ; i <= n ; i++){
cout << setw(5) << a[i] << setw(5) ; // 输出五个场宽
// 输出五个场宽的另一种方法:printf("%5d" , a[i]) ;
}
cout << endl ;
return ;
}
for(int i = 1 ; i <= n ; i++){
if(!vis[i]){ // 该数字在这个排列中没有被用过
a[x] = i ; // 记录这个数字
vis[i] = true ; // 这次用过了
dfs(x + 1) ; // 下一位的排列
vis[i] = false ; // 又没用了
}
}
}
int main(){
cin >> n ;
dfs(1) ; // 从第一个数开始排列
return 0 ;
}
希望对你有所帮助!
这里空空如也
有帮助,赞一个