全排列 DFS实现

全排列 DFS实现

/*
 DFS实现全排列
 递归是我的弱项
 分析递归过程分析的头都大了。。。
 做一下注释
 免得日后想不起来
 运行时注意:
 输入数字最好不要超过两位数
 输入10时运行时间近1min
 产生的output.txt达到惊人的79.6M!!!
 */
#define LOCAL
#include<iostream>
#define N 15
using namespace std;
int n, ans[N], visit[N];
void DFS(int depth)
{
	int i, j;
	for (i = 1; i <= n; i++) //从1到n对数表扫描一遍
	{
		if (!visit[i]) //看哪个数字未被访问就访问之
		{
			visit[i] = 1; //标记为已访问
			ans[depth] = i; //将该数字填表
			if (depth < n) //如果没有填到n
				DFS(depth + 1); //填depth+1
			else //如果填表完毕
			{
				for (j = 1; j <= n; j++) //输出结果
					cout << ans[j] << " ";
				cout << endl;
			}
			visit[i] = 0; //访问完毕返回标记为可访问
			//注意这一句只有当填表完毕输出了结果后才有可能执行到
			//填表完毕表示一个排列已经产生
			//该数自然可以恢复自由身继续被访问了
		}
	}
}
int main()
{
#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	while (cin >> n)
	{
		memset(visit, 0, sizeof(visit));
		DFS(1);			//从1开始往后填表
	}
	return 0;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注