#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
char a[15];//原数组
char re[15];//箱子内容
int vis[15]; //标记箱子
//假设有n个字符要排列,把他们依次放到n个箱子中
//先要检查箱子是否为空,手中还有什么字符,把他们放进并标记。
//放完一次要恢复初始状态,当到n+1个箱子时,一次排列已经结束
void dfs(int step)
{
int i;
if(step==n+1)//判断边界
{
//相应操作
for(i=1;i<=n;i++) cout<<re[i];
cout<<endl;
return ;
}
for(i=1;i<=n;i++)//尝试每一种可能
{
if(vis[i]==0)//满足check条件
{
re[step]=a[i];
vis[i]=1;//标记
dfs(step+1);//继续下一步dfs(step+1)
vis[i]=0;//尝试结束,恢复初始状态(回溯的时候要用到)
}
}
return ;
}
int main()
{
std::ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));//对数组的数据分别初始化
cin>>a+1;
n=strlen(a+1);
dfs(1);//从第一个箱子开始
}
return 0;
}
dfs——全排列问题
猜你喜欢
转载自blog.csdn.net/aaakkk_1996/article/details/82906225
今日推荐
周排行