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

时间:2025-07-05

1. 中国象棋中马的走法

回 溯 法!

马当前所在的位置是当前扩展结点!

每个活结点可能有八个孩子结点!

如何记录马行走的路径?

class Horse{

private:

int chess[5][6];

int d[2][8]={(1,2,2,1-1,-2,-2,-1),(2,1,-1,-2,-2,-1,1,2)};

int sx,sy;

int count;

public:

Horse(int x,int y) {

sx=x; sy=y;

for(int i=0;i<6;i++)

for(int j=0;j<5;j++) chess[i][j]=0;

}

static long computer(){

count=0;

if(sx<0||sy<0||sx>=6||sy>=5) return ;

backtrack(sx,sy);

return count;

}

Private static void backtrack(int p1,int p2);

};

Private static void Horse:: backtrack(int p1,int p2){

int pi,pj;

for(int i=0;i<7;i++){

pi=p1+d[0][i];

pj=p2+d[1][j];

if(pi>=0&&pi<6&&pj>=0&&pj<5&&ch[pi][pj]==0) {

chess[pi][pj]=1;

backtrack(pi,pj);

chess[pi][pj]=0;

} else if(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]个括号,则:

public static int kh(char []x)

{ int n=x.length-1;

int [][]m=new int [m+1][n+1];

for(int i=1; i<=n; i++) m[i][i-1]=0;

for(int i=1; i<=n; i++) m[i][i]=1;

for(int r=2; i<=n; r++)

for(int i=1; i<=n-r+1; i++)

{ int j=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(int k=i; k<j; k++)

m[i][j]=min(m[i][j], m[i][k]+m[k+1][j])

return m[1][n];

}

3. 棋盘的最优分割

问题描述:

一个8×8的棋盘中每个格子里均有一个分值。对棋盘沿着任意一条格子线进行一次分割,将使棋盘成为两块矩形棋盘。给定n<15,对原棋盘进行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时输入数据结束。

输入示例: 输出示例:

8 1,2 1,3 2,4 7,6 4,3 5,6 0,0

3 2,3,6

一个结点代表什么?结点的度说明了什么?为什么按照结点的度由大到小排队?FIFO还是优先队列?删除一个结点意味着什么?之后还需要做什么?

10. 模运算问题

问题描述:某美国麻省理工学院的三位教授发明了目前很流行的编码规则,称为RSA。这种编码规则的使用,要求有一个高效的模运算函数。请你帮他们设计一个这样的函数:对于三个正整数a,b,c(1≤a,b<c≤32768),计算ab mod c

问题分析: 冪运算使得结果数据变大;我们面对的是 ab!

模运算使得结果数据变小。

对乘积及时求莫,把一次莫运算变成多次模运算。

依据: x×y mod z = x× (y mod z)mod z

int fmod(int a,int b,int c) …… 此处隐藏:3366字,全部文档内容请下载后查看。喜欢就下载吧 ……

算法设计与分析_2014期末考试题目.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219