算法设计与分析-分支限界法习题

7-1 布线问题

印刷电路板将布线区域划分成 n×m 个方格阵列,要求确定连接方格阵列中的方格a 点到方格b 的最短布线方案。在布线时,电路只能沿直线布线,为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。问线路至少穿过几个方格。下图是一个布线的例子:

算法设计与分析-分支限界法习题_第1张图片

输入格式:

第1行输入三个正整数,表示布线区域的尺寸n和m(2≤n,m≤100),以及被封锁的方格数k;接下来k行,每行给出两个整数x和y(1≤x≤n,1≤y≤m),表示被封锁方格的坐标(横坐标在前纵坐标在后,下同),坐标原点在左上角,并设定左上角方格坐标为(1, 1),方格间的间距为1;最后一行输入4个整数,分别为方格a与方格b的坐标。

输出格式:

输出只有1行1个整数,为方格a到方格b的最短布线距离,若无法布线,输出-1。

输入样例:

输出样例:

提示:本题不使用分支限界法,不得分!

思路:

经典BFS/DFS走迷宫问题,注意题目样例 初始方格也算一个1个间距 因此初始化距离时为1即可

AC代码:

7-2 最少翻译

据美国动物分类学家内斯特·迈尔推算,世界上有超过100万种动物,各种动物都有自己的语言,假设动物A可以与动物B进行通信,但它不能与动物C通信,动物C只能与动物B通信,所以动物A、B之间的通信需要动物B来当翻译,问两个动物之间相互通信至少需要多少个翻译。

输入格式:

测试数据中第一行包含两个整数n(2<=n<=1000)、m(1<=m<=50000),其中n代表动物的数量,动物编号从0开始,n个动物编号为0~n-1,m表示可以相互通信动物数,接下来的m行中包含两个数字分别代表两种动物可以相互通信,在接下来包含一个整数k(k <= 20),代表查询的数量,对应每个查询包含两个数字,表示彼此通信的两个动物。

输出格式:

对于每个查询,输出这两个动物彼此通信至少需要多少个翻译,若它们之间无法通过翻译来通信,则输出-1。

输入样例:

输出样例:

提示:本题不使用分支限界法,不得分!

思路:

问题转化为求一个无向图中两点间的最短路径,关于最短路径算法我们可以用dijkstra、floyd、spfa、bellman-ford等等,没了解过的同学可以去了解一下,这里我写了两种方法,以下是AC代码

AC代码:

7-3 拯救安妮

原始森林中有很多危险动物,第1种是金刚(一种体型庞大的猩猩),金刚是一种危险的动物,如果遇到金刚,必死无疑;第2种是野狗,它不会像金刚那么危险,但它会咬人,被野狗咬过两次(不管是否同一只野狗咬的),也会死!

安妮是一个美国的女孩,她不幸迷失于原始森林中。杰克非常担心她,他要到原始森林找她。杰克能否找到一条安全的路径营救出安妮呢?

输入格式:

输入的第1行是单个数字t(0<=t<=20),表示测试用例的数目。

每个测试用例是一个原始森林地图,第一行的整数n(0

p表示杰克;a表示安妮;r表示道路;k表示金刚;d表示野狗。

请注意,杰克只能在上、下、左、右4个方向移动。

输出格式:

对于每个测试用例,如果杰克能够安全救出安妮,则在一行中输出“Yes”,否则在一行中输出“No”。

输入样例:

输出样例:

提示:本题不使用分支限界法,不得分!

思路:

同样是BFS走迷宫问题,不同的是注意附带的被野狗咬的次数不能超过2次,我们用一个dist数组记录走到每个位置时被野狗咬的次数即可,然后在扩展时我们遇到野狗特判即可

AC代码:

7-4 饥饿的章鱼 (小数据版本)

作者 J.Liau单位 泉州师范学院

小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃。最开始小易在一个初始位置x_0。对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7。因为使用神秘力量要耗费太多体力,所以它只能使用神秘力量最多20次。贝壳总生长在能被17整除的位置(比如:位置0、17、34、51、……)。小易需要你帮忙计算最少需要使用多少次神秘力量就能吃到贝壳。

输入格式:

输入有多组测试用例,每组用例输入一个初始位置x0,范围在1到1,000,000,000。

输出格式:

对每组用例输出小易最少需要使用神秘力量的次数,如果使用次数使用完还没找到贝壳,则输出-1。

输入样例:

输出样例:

提示:

如果不采用分支限界法,本题不得分!

思路:

BFS迭代 两种情况 开一个哈希表来记录访问的点 用来减少迭代次数

AC代码:

原题来源:网易2017内推笔试编程题-饥饿的小易

注:本题是老师把原题数据改小后发布的,原题数据量很大,BFS迭代若不开哈希表会爆内存。

原题AC代码:

7-5 机器的重量

设某一机器由n个部件组成,部件编号为1~n,每一种部件都可以从m个不同的供应商处购得,供应商编号为1~m。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。对于给定的机器部件重量和机器部件价格,计算总价格不超过d的最小重量机器设计。

输入格式:

第1行输入3个正整数n,m和d(1≤n、m≤20,1≤d≤100)。接下来n行输入wij(每行m个整数,且1≤wij≤10),最后n行输入cij(每行m个整数,且1≤cij≤50)。

输出格式:

输出的第1行包括n个整数,表示每个部件(按1~n的顺序)在对应编号的供应商处购得,第2行为对应的最小重量。

输入样例:

输出样例:

提示:

如果不采用分支限界法,本题不得分!

思路:

dfs深搜,回溯

AC代码:

7-2 马走日

作者 J.Liau单位 泉州师范学院

在m行n列的中国象棋棋盘上,马在左下角处,马走日字,且假设只能往右走(右上或右下),求从起点到右上角处有几种不同的走法、最快走法的步数以及方案。注意,m行n列的棋盘,若左下角坐标是(1, 1),则右上角坐标是(n, m)。

输入格式:

输入有多个用例,每个用例包括1行,各有两个整数m, n(1≤m, n≤20),以输入m=0、n=0结束。

输出格式:

对输入中的每组测试数据,输出2行,第1行1个数字表示从起点(1, 1)到右上角(n, m)处总共不同的走法数;第2行第1个数字输出最快走法的步数;接下来输出最快走法的方案(输出格式见样例),如果存在多个答案输出第1个满足条件结果(为确保答案的唯一性,请按下图的顺序扩展点)。如无法到达终点,只需要输出-1。

算法设计与分析-分支限界法习题_第2张图片

输入样例:

输出样例:

提示:

如果不采用分支限界法,本题不得分!

思路:dfs求方案数 ,bfs求最短路径,开一个二维PII存扩展到每个点的前驱用来打印路径,注意题目右上角为(m,n)与输入是相反的,这题找bug找了几个小时~

AC代码:

(没法测了不知道能不能AC)

你可能感兴趣的:(题解,算法,算法,c++)