算法设计与分析的经典问题
算法设计与分析习题答案

算法设计与分析习题答案算法设计与分析是计算机科学中一个重要的领域,它涉及到算法的创建、优化以及评估。
以下是一些典型的算法设计与分析习题及其答案。
习题1:二分查找算法问题描述:给定一个已排序的整数数组,编写一个函数来查找一个目标值是否存在于数组中。
答案:二分查找算法的基本思想是将数组分成两半,比较中间元素与目标值的大小,如果目标值等于中间元素,则查找成功;如果目标值小于中间元素,则在左半部分继续查找;如果目标值大于中间元素,则在右半部分继续查找。
这个过程会不断重复,直到找到目标值或搜索范围为空。
```pythondef binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return Trueelif arr[mid] < target:low = mid + 1else:high = mid - 1return False```习题2:归并排序算法问题描述:给定一个无序数组,使用归并排序算法对其进行排序。
答案:归并排序是一种分治算法,它将数组分成两半,分别对这两半进行排序,然后将排序好的两半合并成一个有序数组。
```pythondef merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]merge_sort(left_half)merge_sort(right_half)i = j = k = 0while i < len(left_half) and j < len(right_half): if left_half[i] < right_half[j]:arr[k] = left_half[i]i += 1else:arr[k] = right_half[j]j += 1k += 1while i < len(left_half):arr[k] = left_half[i]i += 1k += 1while j < len(right_half):arr[k] = right_half[j]j += 1k += 1arr = [38, 27, 43, 3, 9, 82, 10]merge_sort(arr)print("Sorted array is:", arr)```习题3:动态规划求解最长公共子序列问题问题描述:给定两个序列,找到它们的最长公共子序列。
算法设计与分析试题及答案

1. 按分治策略求解棋盘覆盖问题时,对于如图所示的24×24的特殊棋盘,共需要多少个L 型骨牌;并在棋盘上填写L 型骨牌的覆盖情况。
2. 假设有7个物品,给出重量和价值。
若这些物品均不能被分割,且背包容量M =140,使用回溯方法求解此0-1背包问题。
请画出状态空间搜索树。
3. 假设有7个物品,它们的重量和价值如下表所示。
若这些物品均可以被分割,且背包容量M=140,使用贪心算法求解此背包问题。
请写出求解策略和求解过程。
W (35,30,50,60,40,10,25)p (10,40,30,50,35,40,30)4. 在给出的电路板中,阴影部分是已作了封锁标记的方格,请按照队列式分支限界法在图中确定a 到b 的最短布线方案,要求布线时只能沿直线或直角进行,在图中标出求得最优解时各方格情况。
5. 画出字符表的哈夫曼编码对应的二叉树。
6. 已知1()*()i i k k ij r r A a +=,k =1,2,3,4,5,6,r 1=5,r 2=10,r 3=3,r 4=8,r 5=5,r 6=20,r 7=6,求矩阵链积A 1×A 2×A 3×A 4×A 5×A 6的最佳求积顺序。
7. 给出城市网络图,售货员要从城市1出发,经过所有城市回到城市1,画出该问题的解空间树,描述出用优先队列式分支限界法求解时的搜索情况。
表示出优先队列、当前扩展结点等的变化情况。
8. 依据优先队列式分支限界法,求从s 点到t 点的单源最短路径,画出求得最优解的解空间树。
一、假设有7个物品,它们的重量和价值如下表所示。
若这些物品均不能被分割,且背包容量M=150,使用回溯方法求解此背包问题。
请写出状态空间搜索树(20分)。
答:按照单位效益从大到小依次排列这7个物品为:FBGDECA 。
将它们的序号分别记为1~7。
则可生产如下的状态空间搜索树。
其中各个节点处的限界函数值通过如下方式求得:【排序1分】5x =6x =7x =17分,每个节点1分】a .1501154040305035190.62540-++++⨯=7(1,1,1,1,,0,0)8b. 1501154040305030177.560-++++⨯=7(1,1,1,1,0,,0)12c .4040305010170++++=(1,1,1,1,0,0,1)d. 1501054040303530167.560-++++⨯=3(1,1,1,0,1,,0)4e. 150130404050353017560-++++⨯=1(1,1,0,1,1,,0)3f. 1501304040503510170.7135-++++⨯=4(1,1,0,1,1,0,)7g. 40405030160+++=(1,1,0,1,0,1,0)h. 1501404040353010146.8535-++++⨯=2(1,1,0,0,1,1,)7i.1501254030503530167.560-++++⨯=5(1,0,1,1,1,,0)12 j. 1501454030503530157.560-++++⨯=1(0,1,1,1,1,,0)12在Q 1处获得该问题的最优解为(1,1,1,1,0,0,1),背包效益为170。
算法设计期末大题分析总结

算法设计期末大题分析总结1. 前言在本次算法设计期末大题分析中,我将对所给的几个算法问题进行详细的分析和总结。
这几个算法问题涉及了各个领域,包括图论、动态规划、字符串处理等等。
在解决这些问题的过程中,我运用了所学的算法知识和编程技巧,通过合理的算法设计和优化,解决了这些问题。
2. 问题1:最小生成树给定一个无向图,每个边都有一个正的权值。
我们需要找到一个最小生成树,使得所有边的权值之和最小。
这是一个非常经典的图论问题,常用的解决方法包括Kruskal算法和Prim算法。
在本次问题中,我使用了Prim算法来解决这个问题。
Prim算法的基本思想是从一个顶点开始,逐渐构造最小生成树,每次选择一个与当前顶点距离最短的边。
通过运用堆数据结构来加速选取最短边的过程,使得算法能够在较短的时间内求解问题。
3. 问题2:最长递增子序列给定一个序列,我们需要找到一个最长的递增子序列,即该子序列中的元素按照从小到大的顺序排列。
这是一个动态规划问题,常用的解决方法是使用动态规划算法来求解。
在本次问题中,我使用了动态规划算法来解决这个问题。
动态规划算法的基本思想是将一个大问题划分成若干个相同或者类似的子问题,并且逐步求解这些子问题,最终得到整个问题的解。
为了实现这个算法,我设计了一个动态规划数组dp,其中dp[i]表示以第i个元素结尾的最长递增子序列的长度。
通过不断更新dp数组中的值,最终可以得到最长递增子序列的长度。
4. 问题3:字符串替换给定一个字符串S和两个子串A和B,我们需要将字符串S中所有的子串A都替换成子串B。
这是一个字符串处理问题,常用的解决方法是使用字符串匹配算法来求解。
在本次问题中,我使用了KMP算法来解决这个问题。
KMP算法的基本思想是通过预处理模式串来减少匹配的次数,从而提高算法的效率。
为了实现这个算法,我设计了一个next 数组,其中next[i]表示在模式串的第i个字符之前的子串中,最长的相等的前缀和后缀的长度。
经典算法题解

经典算法题解经典算法题解涵盖了各种计算机科学和编程领域的经典问题。
这些题目不仅具有代表性,而且在算法设计和分析方面具有较高的价值。
以下是一些经典算法题解的例子:1. 动态规划:动态规划是一种解决复杂问题的方法,通过将问题分解成子问题,并求解子问题的最优解,从而找到原问题的最优解。
经典动态规划问题包括背包问题、最长公共子序列(LCS)问题、最长递增子序列(LIS)问题等。
2. 贪心算法:贪心算法是一种解决复杂问题的方法,它总是选择局部最优解,以期望达到全局最优解。
经典贪心算法问题包括哈夫曼编码问题、最小生成树(Kruskal算法、Prim算法等)、最短路径(Dijkstra算法等)等。
3. 分治算法:分治算法是一种解决复杂问题的方法,它将原问题分解成规模较小的子问题,并在子问题上求解,最后合并子问题的解得到原问题的解。
经典分治算法问题包括归并排序、快速排序、归并查找等。
4. 回溯算法:回溯算法是一种解决复杂问题的方法,它通过递归的方式,从一条路线上不断地尝试,直到找到一条可行的路径。
经典回溯算法问题包括八皇后问题、数独问题、背包问题等。
5. 深度优先搜索(DFS)和广度优先搜索(BFS):DFS和BFS 是解决复杂问题的搜索算法,它们通过搜索树或图的方式,寻找问题的解。
经典DFS和BFS问题包括无序集合问题、图的遍历、最短路径等。
6. 字符串匹配算法:字符串匹配算法是解决在文本中查找某个子串的问题。
经典字符串匹配算法包括朴素匹配算法、KMP算法、Boyer-Moore算法等。
7. 数据结构:数据结构是解决计算机科学问题的重要工具。
经典数据结构问题包括链表、栈、队列、树、图等数据结构的操作和应用。
8. 算法复杂度分析:算法复杂度分析是研究算法时间复杂度和空间复杂度的问题。
经典算法复杂度分析问题包括大O标记、大Ω标记、大Ω标记、大Ω标记等。
这些经典算法题解对于提高编程能力和解决实际问题具有很大的帮助。
算法设计与分析常见习题及详解

算法设计与分析常见习题及详解⽆论在以后找⼯作还是⾯试中,都离不开算法设计与分析。
本博⽂总结了相关算法设计的题⽬,旨在帮助加深对贪⼼算法、动态规划、回溯等算法的理解。
1、计算下述算法执⾏的加法次数:输⼊:n =2^t //t 为整数输出:加法次数 k K =0while n >=1 do for j =1 to n do k := k +1 n = n /2return k解析:第⼀次循环执⾏n次加法,第⼆次循环执⾏1/2次加法,第三次循环执⾏1/次加法…因此,上述算法执⾏加法的次数为==2n-12、考虑下⾯每对函数 f(n) 和 g(n) ,如果它们的阶相等则使⽤Θ记号,否则使⽤ O 记号表⽰它们的关系解析:前导知识:,因为解析:,因为解析:,因为解析:解析:3、在表1.1中填⼊ true 或 false解析:利⽤上题的前导知识就可以得出。
2=21/4n +n +21n +41...+1n +n −n +21n −21n +41....−1f (n )=(n −2n )/2,g (n )=6n1<logn <n <nlogn <n <2n <32<n n !<n ng (n )=O (f (n ))f (n )=Θ(n ),g (n )=2Θ(n )f (n )=n +2,g (n )=n n 2f (n )=O (g (n ))f (n )=Θ(n ),g (n )=Θ(n )2f (n )=n +nlogn ,g (n )=n nf (n )=O (g (n ))f (n )=Θ(nlogn ),g (n )=Θ(n )23f (n )=2(log ),g (n )=n 2logn +1g (n )=O (f (n ))f (n )=log (n !),g (n )=n 1.05f (n )=O (g (n ))4、对于下⾯每个函数 f(n),⽤f(n) =Θ(g(n))的形式,其中g(n)要尽可能简洁,然后按阶递增序排列它们(最后⼀列)解析:最后⼀个⽤到了调和公式:按阶递增的顺序排列:、、、、、、、、、(n −2)!=Θ((n −2)!)5log (n +100)=10Θ(logn )2=2n Θ(4)n 0.001n +43n +31=Θ(n )4(lnn )=2Θ(ln n )2+3n logn =Θ()3n 3=n Θ(3)n log (n !)=Θ(nlogn )log (n )=n +1Θ(nlogn )1++21....+=n1Θ(logn )=∑k =1nk 1logn +O (1)1++21....+n 15log (n +100)10(lnn )2+3n logn log (n !)log (n )n +10.001n +43n +313n 22n (n −2)!5、求解递推⽅程前导知识:主定理前导知识:递归树:例⼦:递归树是⼀棵节点带权的⼆叉树,初始递归树只有⼀个结点,标记为权重W(n),然后不断进⾏迭代,最后直到树种不再含有权为函数的结点为⽌,然后将树根结点到树叶节点的全部权值加起来,即为算法的复杂度。
算法设计与分析期末复习题

算法设计与分析期末考试复习题1.算法有哪些特点?为什么说一个具备了所有特征的算法,不一定就是使用的算法?2.证明下面的关系成立:(参考例题1.5--1.6)(1)logn!=Θ(nlogn) (2)2n=Θ(2n+1)(3)n!=Θ(n n) (4)5n2-6n=Θ(n2)3.考虑下面的算法:输入:n个元素的数组A输出:按递增顺序排序的数组A1. void sort(int A[],int n)2. {3. int i,j,temp;4. for(i=0;i<n-1;i++)5. for(j=i+1;j<n;j++)6. if(A[j]<A[i]) {7. temp=A[i];8. A[i]=A[j];9. A[j]=temp;10. }11. }(1)什么时候算法所执行的元素赋值的次数最少?最少多少次?(2)什么时候算法所执行的元素赋值的次数最多?最多多少次?4.考虑下面的算法:输入:n个元素的数组A输出:按递增顺序排序的数组A1. void bubblesort(int A[],int n)2. {3. int j,i,sorted;4. i=sorted=0;5. while(i<n-1 && !sorted) {6. sorted=1;7. for(j=n-1;j>i;j--) {8. if(A[j]<A[j-1]) {9. temp=A[j];10. A[j]=A[j-1];11. A[j-1]=temp;12. sorted=0;13. }14. }15. i=i+1;16. }17. }(1)算法所执行的元素比较次数最少是多少次?什么时候达到最少?(2)算法所执行的元素比较次数最多是多少次?什么时候达到最多?(3)算法所执行的元素赋值次数最少是多少次?什么时候达到最少?(4)算法所执行的元素赋值次数最多是多少次?什么时候达到最多?(5)用О、和Ω记号表示算法的运行时间。
算法设计与分析常见题

1.数字三角形这道题目可以用递归的方法解决。
基本思路是:以D( r, j)表示第r行第j 个数字(r,j都从1开始算),以MaxSum(r, j) 代表从第r 行的第j 个数字到底边的最佳路径的数字之和,则本题是要求MaxSum(1, 1) 。
从某个D(r, j)出发,显然下一步只能走D(r+1, j)或者D(r+1, j+1)。
i.如果走D(r+1, j),那么得到的MaxSum(r, j)就是MaxSum(r+1, j) + D(r, j);ii.如果走D(r+1, j+1),那么得到的MaxSum(r, j)就是MaxSum(r+1, j+1) + D(r, j)。
所以,选择往哪里走,就看MaxSum(r+1, j)和MaxSum(r+1, j+1)哪个更大了。
程序如下:#include <stdio.h>#define MAX_NUM 100int D[MAX_NUM + 10][MAX_NUM + 10];int N;int MaxSum( int r, int j){if( r == N )return D[r][j];int nSum1 = MaxSum(r+1, j);int nSum2 = MaxSum(r+1, j+1);if( nSum1 > nSum2 )return nSum1+D[r][j];return nSum2+D[r][j];}main(){int m;scanf("%d", &N);for( int i = 1; i <= N; i ++ )for( int j = 1; j <= i; j ++ )scanf("%d", &D[i][j]);printf("%d", MaxSum(1, 1));}动态规划:动态规划通常用来求最优解,能用动态规划解决的求最优解问题,必须满足,最优解的每个局部解也都是最优的,并且将中间结果保存以避免重复计算的办法。
算法分析与设计试题及答案

算法分析与设计试题及答案一、选择题1. 下列哪个是属于分治算法的例子?A. 冒泡排序B. 归并排序C. 顺序查找D. 选择排序答案:B2. 在排序算法中,时间复杂度最优的是:A. 冒泡排序B. 插入排序C. 归并排序D. 快速排序答案:C3. 哪个不是动态规划的特点?A. 具有重叠子问题B. 通过递归求解C. 需要保存子问题的解D. 具有最优子结构答案:B4. 在图的广度优先搜索算法中,使用的数据结构是:A. 栈B. 队列C. 数组D. 堆栈答案:B5. 在最小生成树算法中,下列哪个不属于贪心策略?A. Kruskal算法B. Prim算法C. Dijkstra算法D. Prim-Kruskal混合算法答案:C二、简答题1. 请简述分治算法的思想和应用场景。
答案:分治算法的思想是将原问题分解成若干个规模较小且类似的子问题,然后解决子问题,最后将子问题的解合并得到原问题的解。
其应用场景包括排序算法(如归并排序、快速排序)、搜索算法(如二分查找)等。
2. 什么是动态规划算法?请给出一个动态规划算法的示例。
答案:动态规划算法是一种通过将问题分解成子问题并解决子问题来解决复杂问题的方法。
它的特点是具有重叠子问题和最优子结构性质。
以斐波那契数列为例,可以使用动态规划算法求解每一项的值,而不需要重复计算。
3. 图的深度优先搜索和广度优先搜索有什么区别?答案:图的深度优先搜索(Depth First Search,DFS)是一种先访问子节点再访问兄弟节点的遍历算法,通常使用递归或者栈实现。
而广度优先搜索(Breadth First Search,BFS)则是以层次遍历的方式展开搜索,使用队列来实现。
DFS更适合用于搜索路径,BFS则适用于寻找最短路径等。
4. 请简述贪心算法的特点及其应用场景。
答案:贪心算法的特点是每一步都采取当前状态下最优的选择,以期望得到全局最优解。
然而,贪心算法并不一定能求解所有问题的最优解,但对于一些特定问题,贪心算法往往能得到近似最优解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【题目1】N皇后问题(八皇后问题的扩展)【题目2】排球队员站位问题【题目3】把自然数N分解为若干个自然数之和【题目4】把自然数N分解为若干个自然数之积【题目5】马的遍历问题【题目6】加法分式分解【题目7】地图着色问题【题目8】在n*n的正方形中放置长为2,宽为1的长条块【题目9】找迷宫的最短路径。
(广度优先搜索算法)【题目10】火车调度问题【题目11】农夫过河【题目12】七段数码管问题。
【题目13】把1-8这8个数放入下图8个格中,要求相邻的格(横,竖,对角线)上填的数不连续【题目14】在4×4的棋盘上放置8个棋,要求每一行,每一列上只能放置2个【题目15】迷宫问题.求迷宫的路径.(深度优先搜索法)【题目16】一笔画问题【题目17】城市遍历问题【题目18】棋子移动问题【题目19】求集合元素问题(1,2x+1,3X+1类)【题目1】N皇后问题(含八皇后问题的扩展,规则同八皇后):在N*N的棋盘上,放置N个皇后,要求每一横行,每一列,每一对角线上均只能放置一个皇后,问可能的方案及方案数。
const max=8;var i,j:integer;a:array[1..max] of 0..max; {放皇后数组}b:array[2..2*max] of boolean;{/对角线标志数组}c:array[-(max-1)..max-1] of boolean; {\对角线标志数组}col:array[1..max] of boolean; {列标志数组}total:integer; {统计总数}procedure output; {输出}var i:integer;beginwrite('No.':4,'[',total+1:2,']');for i:=1 to max do write(a[i]:3);write(' ');if (total+1) mod 2 =0 then writeln; inc(total);end;function ok(i,dep:integer):boolean; {判断第dep行第i列可放否}beginok:=false;if ( b[i+dep]=true) and ( c[dep-i]=true) {and (a[dep]=0)} and(col[i]=true) then ok:=trueend;procedure try(dep:integer);var i,j:integer;beginfor i:=1 to max do {每一行均有max种放法}if ok(i,dep) then begina[dep]:=i;b[i+dep]:=false; {/对角线已放标志}c[dep-i]:=false; {\对角线已放标志}col[i]:=false; {列已放标志}if dep=max then outputelse try(dep+1); {递归下一层}a[dep]:=0; {取走皇后,回溯}b[i+dep]:=true; {恢复标志数组}c[dep-i]:=true;col[i]:=true;end;end;beginfor i:=1 to max do begin a[i]:=0;col[i]:=true;end;for i:=2 to 2*max do b[i]:=true;for i:=-(max-1) to max-1 do c[i]:=true;total:=0;try(1);writeln('total:',total);end.【测试数据】n=8 八皇后问题No.[ 1] 1 5 8 6 3 7 2 4 No.[ 2] 1 6 8 3 7 4 2 5 No.[ 3] 1 7 4 6 8 2 5 3 No.[ 4] 1 7 5 8 2 4 6 3 No.[ 5] 2 4 6 8 3 1 7 5 No.[ 6] 2 5 7 1 3 8 6 4 No.[ 7] 2 5 7 4 1 8 6 3 No.[ 8] 2 6 1 7 4 8 3 5 No.[ 9] 2 6 8 3 1 4 7 5 No.[10] 2 7 3 6 8 5 1 4 No.[11] 2 7 5 8 1 4 6 3 No.[12] 2 8 6 1 3 5 7 4 No.[13] 3 1 7 5 8 2 4 6 No.[14] 3 5 2 8 1 7 4 6 No.[15] 3 5 2 8 6 4 7 1 No.[16] 3 5 7 1 4 2 8 6 No.[17] 3 5 8 4 1 7 2 6 No.[18] 3 6 2 5 8 1 7 4 No.[19] 3 6 2 7 1 4 8 5 No.[20] 3 6 2 7 5 1 8 4 No.[21] 3 6 4 1 8 5 7 2 No.[22] 3 6 4 2 8 5 7 1 No.[23] 3 6 8 1 4 7 5 2 No.[24] 3 6 8 1 5 7 2 4 No.[25] 3 6 8 2 4 1 7 5 No.[26] 3 7 2 8 5 1 4 6No.[27] 3 7 2 8 6 4 1 5 No.[28] 3 8 4 7 1 6 2 5 No.[29] 4 1 5 8 2 7 3 6 No.[30] 4 1 5 8 6 3 7 2 No.[31] 4 2 5 8 6 1 3 7 No.[32] 4 2 7 3 6 8 1 5 No.[33] 4 2 7 3 6 8 5 1 No.[34] 4 2 7 5 1 8 6 3 No.[35] 4 2 8 5 7 1 3 6 No.[36] 4 2 8 6 1 3 5 7 No.[37] 4 6 1 5 2 8 3 7 No.[38] 4 6 8 2 7 1 3 5 No.[39] 4 6 8 3 1 7 5 2 No.[40] 4 7 1 8 5 2 6 3 No.[41] 4 7 3 8 2 5 1 6 No.[42] 4 7 5 2 6 1 3 8 No.[43] 4 7 5 3 1 6 8 2 No.[44] 4 8 1 3 6 2 7 5 No.[45] 4 8 1 5 7 2 6 3 No.[46] 4 8 5 3 1 7 2 6 No.[47] 5 1 4 6 8 2 7 3 No.[48] 5 1 8 4 2 7 3 6 No.[49] 5 1 8 6 3 7 2 4 No.[50] 5 2 4 6 8 3 1 7 No.[51] 5 2 4 7 3 8 6 1 No.[52] 5 2 6 1 7 4 8 3 No.[53] 5 2 8 1 4 7 3 6 No.[54] 5 3 1 6 8 2 4 7 No.[55] 5 3 1 7 2 8 6 4 No.[56] 5 3 8 4 7 1 6 2 No.[57] 5 7 1 3 8 6 4 2 No.[58] 5 7 1 4 2 8 6 3 No.[59] 5 7 2 4 8 1 3 6 No.[60] 5 7 2 6 3 1 4 8 No.[61] 5 7 2 6 3 1 8 4 No.[62] 5 7 4 1 3 8 6 2 No.[63] 5 8 4 1 3 6 2 7 No.[64] 5 8 4 1 7 2 6 3 No.[65] 6 1 5 2 8 3 7 4 No.[66] 6 2 7 1 3 5 8 4 No.[67] 6 2 7 1 4 8 5 3 No.[68] 6 3 1 7 5 8 2 4 No.[69] 6 3 1 8 4 2 7 5 No.[70] 6 3 1 8 5 2 4 7 No.[71] 6 3 5 7 1 4 2 8 No.[72] 6 3 5 8 1 4 2 7 No.[73] 6 3 7 2 4 8 1 5 No.[74] 6 3 7 2 8 5 1 4 No.[75] 6 3 7 4 1 8 2 5 No.[76] 6 4 1 5 8 2 7 3 No.[77] 6 4 2 8 5 7 1 3 No.[78] 6 4 7 1 3 5 2 8 No.[79] 6 4 7 1 8 2 5 3 No.[80] 6 8 2 4 1 7 5 3 No.[81] 7 1 3 8 6 4 2 5 No.[82] 7 2 4 1 8 5 3 6 No.[83] 7 2 6 3 1 4 8 5 No.[84] 7 3 1 6 8 5 2 4 No.[85] 7 3 8 2 5 1 6 4 No.[86] 7 4 2 5 8 1 3 6 No.[87] 7 4 2 8 6 1 3 5 No.[88] 7 5 3 1 6 8 2 4 No.[89] 8 2 4 1 7 5 3 6 No.[90] 8 2 5 3 1 7 4 6 No.[91] 8 3 1 6 2 5 7 4 No.[92] 8 4 1 3 6 2 7 5 total:92对于N皇后:┏━━━┯━━┯━━┯━━┯━━┯━━┯━━┯━━┓┃皇后N│ 4 │ 5 │ 6 │ 7│ 8 │ 9 │ 10 ┃┠───┼──┼──┼──┼──┼──┼──┼──┨┃方案数│ 2 │ 10 │ 4 │ 40 │ 92 │352 │724 ┃┗━━━┷━━┷━━┷━━┷━━┷━━┷━━┷━━┛【题目2】排球队员站位问题┏━━━━━━━━┓图为排球场的平面图,其中一、二、三、四、五、六为位置编号,┃┃二、三、四号位置为前排,一、六、五号位为后排。
某队比赛时,┃┃一、四号位放主攻手,二、五号位放二传手,三、六号位放副攻┠──┬──┬──┨手。
队员所穿球衣分别为1,2,3,4,5,6号,但每个队┃四│ 三│ 二┃员的球衣都与他们的站位号不同。
已知1号、6号队员不在后排,┠──┼──┼──┨2号、3号队员不是二传手,3号、4号队员不在同一排,5号、┃五│ 六│ 一┃6号队员不是副攻手。
┗━━┷━━┷━━┛编程求每个队员的站位情况。
【算法分析】本题可用一般的穷举法得出答案。
也可用回溯法。
以下为回溯解法。
【参考程序】type sset=set of 1..6;var a:array[1..6]of 1..6;d:array[1..6]of sset;i:integer;procedure output; {输出}beginif not( (a[3]in [2,3,4])= (a[4] in[2,3,4])) thenbegin { 3,4号队员不在同一排}write('number:');for i:=1 to 6 do write(i:8);writeln;write('weizhi:');for i:=1 to 6 do write(a[i]:8);writeln;end;end;procedure try(i:integer;s:sset); {递归过程i:第i个人,s:哪些位置已安排人了}varj,k:integer;beginfor j:=1 to 6 do begin {每个人都有可能站1-6这6个位置}if (j in d[i]) and not(j in s) then begin{j不在d[i]中,则表明第i号人不能站j位. j如在s集合中,表明j位已排人了}a[i]:=j; {第i 人可以站j 位}if i<6 then try(i+1,s+[j]) {未安排妥,则继续排下去}else output; {6个人都安排完,则输出}end;end;end;beginfor i:=1 to 6 do d[i]:=[1..6]-[i]; {每个人的站位都与球衣的号码不同}d[1]:=d[1]-[1,5,6];d[6]:=d[6]-[1,5,6]; {1,6号队员不在后排}d[2]:=d[2]-[2,5];d[3]:=d[3]-[2,5]; {2,3号队员不是二传手}d[5]:=d[5]-[3,6];d[6]:=d[6]-[3,6]; {5,6号队员不是副攻手}try(1,[]);end.【题目3】把自然数N分解为若干个自然数之和。