深度优先搜索经典算法

记录下今天所学的深度优先搜索实例
思想想必我们大概了解,还是要通过经典的例题来练习
题目1:
假如有编号为1 、2、3 的3 张扑克牌和编号为l 、2 、3 的3 个盒子。
现在需要将这3 张扑克牌分别放到3 个盒子里面,并且每个盒子有且只能放一张扑克牌。那么一共有多少种不同的放法呢?

/**

全排列问题

dfs 
解决思路:
1 2 3
1 3 2 //3先退出 2也退出 此时i=2 i++ ---> i=3  所以 3进入 再 2进入
后面的一次类推 

*/
#include 

int flag[20];
int n;
int number[20];
void dfs(int x){
     
	
	if(x==n+1)//第n+1层结束 开始输出 
		{
     
			int i;
			for(i=1;i<=n;i++)
				printf("%d ",number[i]);
				printf("\n");
				return ;
			
		}
	for(int i=1;i<=n;i++){
     
		
		if(flag[i]==0)//未被访问过
		{
     
			number[x]=i;//x代表第x层 从第一层开始 
			flag[i]=1;
			dfs(x+1);
			flag[i]=0;//置未访问过 
		 } 
		
	}
	
}

int main(){
     
	scanf("%d",&n);
	dfs(1);
	
} 

题目2:n皇后问题

/**

n皇后问题 
8皇后一共有92种方法 

*/
#include 

int u[20];//主对角线 
int v[20];//斜对角线 
int lie[20];

int a[20];//存放数字的 

int n,count;


void dfs(int x){
     
	
	if(x==n+1){
     //结束条件 
		
		count++;
		return ;
	}
	
	for(int i=1;i<=n;i++){
     //行已经定住了 
		
		if(lie[i]==0&&u[x-i+n]==0&&v[x+i]==0){
     //符合一定的规则  解决列 主对角线 和副对角线 
			
			lie[i]=1;
			u[x-i+n]=1;
			v[x+i]=1;
			a[x]=i;
			dfs(x+1);
			lie[i]=0;
			u[x-i+n]=0;
			v[x+i]=0;
		}
		
	}
}

int main(){
     
	
	scanf("%d",&n);
	dfs(1);//从第一层开始 
	printf("%d\n",count);
}

你可能感兴趣的:(经典算法)