输出1——n的排列(深度优先搜索)

样例输入:

3

样例输出:

123
132
213
231
312
321

 1 #include <stdio.h>
 2 int n;
 3
 4 void dfs(int step,int* a,int* book)
 5 {
 6     int i;
 7     if(step == n)
 8     {
 9         for(i = 0;i < n;i++)
10         {
11             printf("%d",a[i]);
12         }
13         printf("\n");
14         return ;
15     }
16
17     for(i = 0;i < n;i++)
18     {
19         if(book[i] == 0)
20         {
21             a[step] = i+1;
22             book[i] = 1;
23             dfs(step+1,a,book);
24             book[i] = 0;
25         }
26     }
27 }
28 int main()
29 {
30     scanf("%d",&n);
31     int a[n+1],book[n+1],i;
32     for(i = 0;i < n;i++)
33     {
34         a[i] = 0;
35         book[i] = 0;
36     }
37     dfs(0,a,book);
38     return 0;
39 }
时间: 2024-10-12 13:52:19

输出1——n的排列(深度优先搜索)的相关文章

深度优先搜索和广度优先搜索的深入讨论

一.深度优先搜索和广度优先搜索的深入讨论 (一)深度优先搜索的特点是: (1)从上面几个实例看出,可以用深度优先搜索的方法处理的题目是各种各样的.有的搜索深度是已知和固定的,如例题2-4,2-5,2-6:有的是未知的,如例题2-7.例题2-8:有的搜索深度是有限制的,但达到目标的深度是不定的. 但也看到,无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生规则以及输出要求. (2)深

深度优先搜索和广度优先搜索的比较与分(转)

深度优先搜索和广度优先搜索的深入讨论   (一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生规则以及输出要求. (2)深度优先搜索法有递归以及非递归两种设计方法.一般的,当搜索深度较小.问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂.当搜索深度较大时,当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设

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

前段时间在洛谷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. 图的深度优先遍历要解决的问题 图的深度优先搜索与树的深度优先搜索类似,但是对图进行深度优先搜索要解决一个问题,那就是顶点的重复访问,假设图中存在一个环路A-B-C-A,那么对顶点A进行展开后得到B,对B进行展开后得到C,然后对C进行展开后得到A,然后A就被重复访问了... 这显然是不对的!我们需要用一个状态变量来记录一个顶点被访问和被展开的状态.在<算法导论>中,作者使用3种颜色来对

有关搜索和深度优先搜索的浅陋见解

祝食用愉快XD 题目链接 (是一道胡乱出的题) U56815 来走迷宫鸭! 解题思路 深度优先搜索,如果能不碰墙地到达右下角的出口,就把旗子立起来表示找到了出口. 什么?你没听过深度优先搜索 没事,且听我道来. 什么是搜索?如何搜索? 简单来说,搜索就是一种特殊的(递归的)枚举.从一种可行的方案进行扩展,并去看这个扩展出来的东西符不符合现有规则.能不能继续扩展. 可是你讲理论我也听不懂啊 那,深度优先搜索又是什么呢? 拿走迷宫这事儿说起.如果你玩过\(MC\),或者无论从哪个去掉了解走迷宫的时候

深度优先搜索(dfs)

关于深度优先搜索的总结: 1 dfs 的基本结构:  void dfs(int x){ if( x 超出边界){ return ; }else{ for(遍历){ if(未访问过){ 访问         ; 打上标记    ; dfs(x + 1) ; 去掉标记    ; //极易忘记 } } } return; } 2 用dfs求全排列: 本来好好的,结果sizeof(pointer) 就完蛋了.神秘的内存错误,而且还能正常的跑出一个不正常的结果出来. 想了解sizeof这个小妖精的看这里

完全二叉树深度优先搜索

题目 使用一个长度为N的数组,1<=N<=50,存储一棵完全二叉树.(二叉树中每个节点最多有两个子树称为左子树和右子树.完全二叉树是除最后一层外,每一层上的节点数均达到最大值:在最后一层上只缺少右边的若干节点.在数组中,如果以下标1为起始位置,那么每个节点的左儿子是其自己下标乘以2的节点,右儿子是自己下标乘以2加1的节点,即arr[i*2]和arr[i*2+1]是arr[i]的左右儿子.)然后使用左子树优先的深度优先搜索方法搜索一棵完全二叉树中的一个值为X的节点,最终输出其深度优先搜索的过程,

castle problem——(深度优先搜索,递归实现和stack实现)

将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main() {while(在图中能找到未访问过的点 k)Dfs(k);} 4例题:百练2815 城堡问题? 右图是一个城堡的地形图.请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大.城堡被分割成m×n(m≤50,n≤50)个方块,每个方块可以有0~4面墙.5输入输出? 输入? 程序从标准输入设备

深度优先搜索入门:POJ1164城堡问题(递归、用栈模拟递归)

将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main() {while(在图中能找到未访问过的点 k) Dfs(k);} 例题: POJ1164 The Castle Description 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#-