算法设计与分析_2014期末考试题目

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1.中国象棋中马的走法回溯法!马当前所在的位置是当前扩展结点!每个活结点可能有八个孩子结点!如何记录马行走的路径?classHorse{private:intchess[5][6];intd[2][8]={(1,2,2,1-1,-2,-2,-1),(2,1,-1,-2,-2,-1,1,2)};intsx,sy;intcount;public:Horse(intx,inty){sx=x;sy=y;for(inti=0;i6;i++)for(intj=0;j5;j++)chess[i][j]=0;}staticlongcomputer(){count=0;if(sx0||sy0||sx=6||sy=5)return;backtrack(sx,sy);returncount;}Privatestaticvoidbacktrack(intp1,intp2);};PrivatestaticvoidHorse::backtrack(intp1,intp2){intpi,pj;for(inti=0;i7;i++){pi=p1+d[0][i];pj=p2+d[1][j];if(pi=0&&pi6&&pj=0&&pj5&&ch[pi][pj]==0){chess[pi][pj]=1;backtrack(pi,pj);chess[pi][pj]=0;}elseif(pi==sx&&pj==sy)count++;}};2.合法的括号序列问题描述:定义合法的括号序列:1.空序列是合法的括号序列;2.如果符号串S是合法的括号序列,则(S)和[S]均是合法的括号序列;3.如果符号串A和B是合法的括号序列,则AB也是合法的括号序列。现有由(,),[,]组成的任意符号串X=x1x2…xn,请添加尽可能少的四种括号,使其成为一个合法的括号序列。动态规划!分析:假设子问题Xij=xixi+1…xkxk+1…xj-1xj最少需要添加m[i][j]个括号,则:publicstaticintkh(char[]x){intn=x.length-1;int[][]m=newint[m+1][n+1];for(inti=1;i=n;i++)m[i][i-1]=0;for(inti=1;i=n;i++)m[i][i]=1;for(intr=2;i=n;r++)for(inti=1;i=n-r+1;i++){intj=i+r-1;m[i][j]=MaxINT;if(x[i]==‘(‘&&x[j]==‘)’||x[i]==‘[‘&&x[j]==‘]’)m[i][j]=min(m[i][j],m[i+1][j-1]);if(x[i]==‘(‘||x[i]==‘[’)m[i][j]=min(m[i][j],m[i+1][j])+1;if(x[j]==‘)‘||x[j]==‘]’)m[i][j]=min(m[i][j],m[i][j-1])+1;for(intk=i;kj;k++)m[i][j]=min(m[i][j],m[i][k]+m[k+1][j])returnm[1][n];}3.棋盘的最优分割问题描述:一个8×8的棋盘中每个格子里均有一个分值。对棋盘沿着任意一条格子线进行一次分割,将使棋盘成为两块矩形棋盘。给定n15,对原棋盘进行n-1次分割,就把棋盘分割成了n块矩形棋盘。一块矩形棋盘的总分是他的所有格子的分值之和。请设计算法,给出把原棋盘分割成n块矩形棋盘的方案,使得各矩形棋盘总分的平方和最小。其中xi是第i块棋盘的总分。动态规划!假设左上角为(x1,y1)、右下角为(x2,y2)的棋盘的总分为:s[x1,y1,x2,y2],被切割k次后得到的k+1块矩形的总分平方和的最小值是:d[k,x1,y1,x2,y2]则:d[k,x1,y1,x2,y2]=min{min{d[k-1,x1,y1,a,y2]+s[a+1,y1,x2,y2],d[k-1,a+1,y1,x2,y2]+s[x1,y1,a,y2]}(x1≤a<x2),min{d[k-1,x1,y1,x2,b]+s[x1,b+1,x2,y2],d[k-1,x1,b+1,x2,y2]+s[x1,y1,x2,b]}(y1≤b<y2),我们最终需要的是:d[n][1][1][8][8]4.多边形游戏问题描述:a任意画了一个凸n边形,并任意对其n个顶点进行1到n的编号。A又再这个多边形上画了m条不会相交于多边形内部的弦。现在a以(i,j)的方式把这n条边和m条弦告诉给b,让b说出n边形的n个顶点的编号顺序。其中(i,j)是编号为i、j的两个顶点之间的一条边或者弦。问题分析:“m条不会相交与多边形内部的弦”表明:a画的n边形中至少有两个顶点不是任何弦的端点,而交于这个顶点的必定是多边形的边。这样的顶点的度为2!算法:1.求出所有度为2的顶点;2.当存在度为2的取出一个度为2的顶点s,以s为端点的边是(s,u)和(s,v);2.从边集中删除这两个边,并标记或补充补充标记虚边(u,v);5.分离英文单词问题分析:字母表∑是否存在两个不相交的子集A和B,他们中所有单词的长度之和均等于n?No:∑不存在长度为n的双重单词串!Why?等量0-1背包问题Yes:∑的长度为n的双重单词串的构造算法。分别由字母表∑的子集A和B中所有单词构造长度为n相同的两个字符串,该字符串就是∑上的长度为n的双重单词串!6.会餐交友问题输入数据:n表示客人的个数,客人的编号依次是1,2,…,n。i,j表示客人i和j相互认识;i=0&&j=0时输入数据结束。输入示例:输出示例:81,21,32,47,64,35,60,032,3,6一个结点代表什么?结点的度说明了什么?为什么按照结点的度由大到小排队?FIFO还是优先队列?删除一个结点意味着什么?之后还需要做什么?10.模运算问题问题描述:某美国麻省理工学院的三位教授发明了目前很流行的编码规则,称为RSA。这种编码规则的使用,要求有一个高效的模运算函数。请你帮他们设计一个这样的函数:对于三个正整数a,b,c(1≤a,b<c≤32768),计算abmodc问题分析:冪运算使得结果数据变大;我们面对的是ab!模运算使得结果数据变小。对乘积及时求莫,把一次莫运算变成多次模运算。依据:x×ymodz=x×(ymodz)modzintfmod(inta,intb,intc){if(!((1=a&&ac)&&(1=b&&bc)&&c=32768))return-1;intd=1;for(inti=1;i=b;i++)d=d*amodc;fmod=d;returnfmod;}11.最短表面距离问题问题描述:一个长方体P={(x,y,z)|0≤x≤L,0≤y≤W,0≤z≤H}的表面上有两个点A(x1,y1,z1)和B(x2,y2,z2),求A与B之间的最短表面距离。问题分析:平面上两点之间的直线距离最短;球面上两点之间的最短距离?延伸:此问题非平面亦非球面。转化:将长方体表面上的两点转化成平面上的两点。区分:1.两点在长方体的同一表面上;2.两点在长方体的两个相邻表面上;3.两点在长方体的两个相对表面上。1.A(x1,y1,z1)和B(x2,y2,z2)在长方体的同一表面上。直接计算直线距离!2.A(x1,y1,z1)和B(x2,y2,z2)在长方体的两个相邻表面上。展开长方体;分三种情况;取小。3.A(x1,y1,z1)和B(x2,y2,z2)在长方体的两个相对表面上。展开长方体;分12种情况;取小。12.多花钱多卖鱼问题问题分析:这个问题有一些约束条件:1.所买鱼的价格总和不能超过资金数m;2.不能共存的鱼不能同时购买;3.每种鱼最多买一条;4.在满足上述条件的前提下,买尽可能多的鱼;5.在满足上述条件的前提下,花尽可能多的买鱼钱。13.巧妙的剪纸问题问题分析:我们需要解决两个问题:1.如何巧妙地将所有带*的纸剪成两片纸?2.这两片纸如何拼接成一个正方形?所有的*是连通的。剪掉所有的空白纸,并记录横向或者纵向上*连续个数大于n的直线坐标。从左到右、从上到下找到第一个与空白纸相邻的*,从此开始,按照右手规则剪掉所有的空白纸。n×n的正方形是由两片纸拼接成的。这两片纸中直线上有连续n个*的情形可以分为几种?!带*的纸片上连续超过n个*的直线是需要下剪子的。纸片的平移、旋转和翻转。对两张纸片分别进行矢量化处理。若取左上角方格的坐标是(0,0),则任意方格都有了相对坐标(x,y)。旋转(逆时针90。):(x,y)→(-y,x)。翻转(上下):(x,y)→(x,-y)。(左右):(x,y)→(-x,y)。平移:(x,y)→(x±d,y±d)拼接:做一个n×n的正方形模版。先把第一张纸片放进去,再将第二张纸片经过有限次平移、旋转和翻转后放进去,若成功,则结束。15.盒子里的气球问题问题描述:在一个长方体盒子里,有n个点。在任何一个点上放置一个半径为0的气球,它就会膨胀成一个以该点为球心的标准球体,直到接触到其他气球或盒子的边界。必须等到一个气球膨胀停止后才能放置下一个气球。按照什么样的顺序在这n个点上放置气球,能使得n个气球放置完毕后,所有气球的体积总和最大。枚举法!假设要放置的第i个气球的球心是(xi,yi,zi),现在需要计算它膨胀停止后的半径Ri。假定它最终接触到的气球是半径为Rj的第j个气球,则:Ri=min{Dij=((xi-xj)2+(yi-yj)2+(zi-zj)2))1/2-Rj;(xi,yi,zi)到盒子每个面的距离}16.钓鱼问题贪心算法!钓5分钟鱼称为钓1次鱼枚举所有他可能走的湖波数X,即从1走到X,则路上花去的时间为在这种情况下我们可以不用考虑在湖间移动的时间,可以认为是“瞬间转移”即可认为在每一时刻都可以从湖波1到X中任选一个钓1次鱼Time_trans=0;Fishmax=0;For(X=1;X=N;x++){time_fish=H–time_trans;fish=fishing(X,time_fish);if(fishfishmax)fishmax=fish;time_trans+=Ti}要对需要钓的湖进行枚举,n种可能如果需要钓k个单位时间的鱼,k次选择每个单位时间选择的时间复杂度为O(n)时间复杂度O(kn2)17.折纸留痕问题18.三色凸多边形问题19.超长数字串问题20.彩球问题递归与分治算法!21.月亮之眼问题递推22.丢失的正整数数列问题问题描述:数学老师给全班同学写了一个包含n个正整数的递增数列,要求大家回家后同样按照递增的次序,写出所有的、任意两个数的和。有个同学很快就写完了作业。可是他出去玩了一会,回来后发现老师给的原始数列丢失了。你能帮他找回来吗?问题分析:假设这个同学丢失的正整数递增数列是:a1,a2,a3,a4,…,an他写出的结果包含了n(n-1)/2个数,它们由小到大是:k1,k2,k3,k4,…a1+a2=k1,a1+a3=k2a2+a3=???假设a2+a3=kx,则解方程可得:a1,a2,a3依次递推计算写出每个ai23.电气工程师的烦恼问题分析:以各条网线的编号1,2,3,…,n为顶点构造一个有向图。若ij同时i与j不相交,则画由i到j的有向边;若ij同时i与j相交,则画由j到i的有向边;每个顶点的入度就是它前面网线的条数!!!入度为0的顶点唯一!!拓扑排序!!25.士兵排队问题中位数原理快速选择算法28.团伙(i,j,0):i和j是朋友,合并i和j所在的朋友集合(i,j,1):i和j是敌人,i的敌人是集合e[i]将i置入集合e[j]将j置入集合e[i]集合的存储结构树29.方块消除游戏一个方块游戏可以描述成:(c[1],l[1]),(c[2],l[2]),…,(c[n],l[n])(c[i],l[i])表示第i个区域的颜色c[i]和方块个数l[i]假设f[i,j,k]是消除下列区域的最大得分:(c[i],l[i]),(c[i+1],l[i+1]),…,(c[j-1],l[j-1]),(c[j]

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功