dfs——全排列问题

#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;
}




猜你喜欢

转载自blog.csdn.net/aaakkk_1996/article/details/82906225
今日推荐