n个数的全排列(dfs)

n个数的全排列:

#include <iostream>
using  namespace std;
int a[10], book[10];//数组a表示格子,数组book[]表示卡片是否用过,全局变量在没有赋值之前都是0 
int n;
void dfs(int step) {//step表示现在开始摆放第几个盒子
	int i;
	if (step == n + 1) {//如果摆放n+1时,说明前面n个盒子都已经摆放好了
		for (i = 1; i <= n; i++) {
			cout << a[i];
		}
		cout << endl;
		return;//返回之前的一步(最近一次调用dfs函数的地方)
	}
	//此时在第step个盒子面前,把每张牌来一一尝试
	for (i = 1; i <= n; i++) {
		if (book[i] == 0) {
			//开始尝试扑克牌i    	
			a[step] = i;//将i号牌放入第step个盒子里        
			book[i] = 1;//表示此时牌i已经不再手上
			//第step个盒子已经放好了,此时尝试第step+1个盒子
			dfs(step + 1);//递归调用自己
			book[i] = 0;//一封要将之前尝试的牌收回,才可以进行下一次尝试
		}
	}
};
int main()
{
	cin >> n;
	dfs(1);//首先从第一个盒子开始
	return 0;
}

深度优先搜索的基本类型:

void dfs(int step){
    判断边界
    尝试每一种可能
    for(i=1;i<=n;i++){
        继续下一步dfs(step+1);
    }
    返回
}




猜你喜欢

转载自blog.csdn.net/yky__xukai/article/details/80275060
今日推荐