深度优先搜索与全排列

做题过程中我们经常会遇到这样的问题:

输入一个数n,输出1-n的全排列。可能很多人会想到枚举暴力,这里给大家介绍一种算法:深度优先搜索

在这里举个简单的例子

假如有编号为1 、2、3 的3 张扑克牌和编号为l 、2 、3 的3 个盒子。

现在需要将这3 张扑克牌分别放到3 个盒子里面,并且每个盒子有且只能放一张扑克牌。那么一共有多少种不同的放法呢?

首先 我们应该设置一个标志数组 book 记录当前数字是否被使用过。

然后用一个数组a 表示盒子并且初始化a[i]=i;

代码如下:

#include<stdio.h>
int n,a[10],book[10];//特别说明c语言全局变量没有赋值默认为 0,无需再次初始化;
void dfs(int step)//step 表示当前在第几个位置
{
	int i;
	if(step==n+1)//如果step==n+1表示前n个数字已经放好
	{
		//输出一种全排列
		for(i=1;i<=n;i++)
		 printf("%d",a[i]);
	    printf("\n");
	   return;
	}
	//每次搜索都从1-n 一一尝试
	for(i=1;i<=n;i++)
	{
		if(book[i]==0)//判断次数字是否用过
		{
			a[step]=i;//存储当前位置的数字,以便满足条件输出
			book[i]=1;//当前数字已用过,改变标志,以防重用
			dfs(step+1);//放好当前位置数字之后,安排下一个数字
			book[i]=0;//回溯,当满足一种全排列后,进行下一种尝试
		}
	}
	return ;
}
int main()
{
	scanf("%d",&n);//输入只能为1-9之间的整数,表示1-n的全排列
	dfs(1);//从第一个位置开始
	return 0;
} 

同时总结了下基本模型,希望有用:

void dfs(int step)
{
     判断边界
      尝试每一种可能
      for(i=1;i<=n;i++)
     {
             继续下一步dfs(step+1);
     }
   返回
}
时间: 2024-10-12 02:49:27

深度优先搜索与全排列的相关文章

深度优先搜索之全排列

小馨小诺还有小雪和小谢四个人去学校,路上他们走成了一排,爱思考的小馨提出了问题:我们四个人一排共有多少种站法? 数学比较好的小雪说这不是全排列吗,有4的阶乘种4*3*2*1=24种啊. 小馨说对,但是你用编程模拟一下. 小谢自信的回答道四层for循环然后去重即可. 小馨还是不太满意,要是有n个人呢. 小诺说可以用深度优先搜索,但大家都不明白深度优先搜索. 不明白就 关注啊哈磊.小诺也是从那学来的. 1 #include<stdio.h> 2 3 int a[10],book[10],n; 4

从排列到组合——深度优先搜索

前段时间在洛谷3.0上刷到一个题,让本人挠头了一段时间,RT: 题目描述 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34. 现在,要求你计算出和为素数共有多少种. 例如上例,只有一种的和为素数:3+7+19=29. 首先解决这个问题显

python实现基础的深度优先搜索(DFS, depth first search)解决数的全排列问题

数的全排列,是一个很简单的问题,平时我们用笔用纸就能列出答案,但是数列位多的时候,排列的结果就有非常多了,例如有1,2,3,4,5,6,7,8,9这一个数列,有9个数字,则有9!(9的阶乘)这么多种结果.那是非常大的.今天我就来介绍用深度优先搜索来解决这个数的全排列的问题. 深度优先搜索 首先简单介绍一下深度优先搜索,深度优先搜索的关键在于当下该如何做,至于下一步如何做,就与当下做的一样.深度优先搜索的基本模型为: dfs(step): 判断边界:执行相关操作,返回 尝试每一种可能 for( i

深度优先搜索思想初体验

1.求数字 1~n 的全排列 import java.util.Scanner ; public class Permutation{ //求数字 1~n 的全排列: int[] array ; int[] book ; int n ; public void permutation(int step){ // 深度优先搜索思想: if (step==n+1) { for (int i=1;i<=n;i++) { System.out.print(array[i] + " ")

第四章 搜索(深度、广度搜索、全排列、走迷宫、再解炸弹人、宝岛探险、水管工游戏)

一.深度优先搜索DFS 深度优先搜索DFS的关键思想是:当下应该怎么做(每个方法都试一遍),这一步解决后,进入下一步,下一步的解决方法和这一步的解决方法是一样的 DFS的基本模型 void dfs(int step) { 判断边界 尝试每一种可能  for(i=1;i<=n;i++) { 继续下一步 dfs(step+1) } 返回 } 1.1全排列 1 //输入一个数n 2 //输出1-n的全排列 3 #include <stdio.h> 4 int n, book[10], a[10

代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)

归并排序 求逆序数 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 首先考虑下如何将将二个有序数列合并.这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数.然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可. //将有序数组a[]和b[]合并到c[]中 void MemeryArray(int a[], int n, int b[], int m, int c

深度优先搜索 - 简单demo

输入一个数n,输出 1 ~ n 的全排列,例如输入 3,全排列则为:123,132,213,231,312,321 一共六种. 这里采用深度优先搜索来解决这个问题: #include<stdio.h> int n; int a[10],book[10]; //递归核心代码 void dfs(int step) { if(step == n+1){ //递归结束条件 for(int i=1;i<=n;i++){ printf("%d",a[i]); } printf(&

BFS/DFS 广度/深度优先搜索

深度优先搜索DFS 所谓深度优先搜索,通俗点理解就是一条路走到头--不撞南墙不回头. 我们先来看一个全排列问题,现在要对1 2 3进行全排列,现在小哼手上拿着1 2 3三张卡片,他要将这三张卡片放入三个盒子里,每放满不就是一种全排列了么? 但是每次到底是先放卡片1还是卡片2,3呢? 小哼想,我按顺序放吧,每次都按照1.2.3的顺序放卡片.于是他走到1号盒子前把卡片1放入,走到2号盒子前把卡片2放入,走到3号盒子前把卡片3放入,走到四号盒子...但小哼的卡片已经放完 啦.这时就产生了一种全排列"1

深度优先搜索---一个懵逼的东东

深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.(来自百度百科) 先解释以下深度: 深度指在搜索的过程中沿着一条路一直向下进行,直到这条路没有下一个节点停止,然后返回到上一步接着进行上述操作 所以深度优先搜索的整体结构就是: 1.递归2.剪枝 可能这样说有点不清楚,举个例子 打印1-4的全排列开头为1和2的所有序列; 1 2 3 4 1 2 4 3 1 3 2 4 1 3