You are on page 1of 15

搜索

[UVa129] Krypton Factor


如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的
串”。例如,BB, ABCDACABCAB, ABCDABCD 都是容易的串,而
D, DC, ABDAB, CBABCBA 都是困难的串。

输入正整数 n 和 L,输出前 L 个字符组成的、字典序第 k 小的困难的串。例如,前 7


个困难的串分别为 A, AB, ABA, ABAC, ABACA, ABACAB, ABACABA。
输入保证答案不超过 80 个字符。1 ≤ L ≤ 26。
由于题目保证答案不超过 80 个字符,直接暴力搜索即可。

每次向串中尝试加入一个字符,判断生成的新串是否是“困难的串”。由于相比原来的串
只是新加了一个字符,判断新串的所有后缀是否存在两个想邻的重复子串即可。

每次按照字典序尝试加入字符,到达第 k 个输出答案。
The Grove
牧场里有一片树林,林子里有坑.

贝茜很想知道,最少需要多少步能围绕树林走一圈,最后回到起点。她能上下左右走,
也能走对角线格子.牧场被分成 R 行 C 列(1 ≤ R ≤ 50, 1 ≤ C ≤ 50)。下面是一张
样例的地图,其“.”表示贝茜可以走的空地,“X”表示树林,“*”表示起点。

.......

...X...

..XXX..

...XXX.

......*

这题跟普通的搜索多了一个返回起点的过程。

假设一开始是从右边沿着树林到达左边,可以发现,回到起点的过程中,一定会经过从
左边到达右边的情况。我们可以从最上面的那个X位置向下画一条线。在进行bfs的时候
如果跨过了这条线,将状态转换。这样就可以解决回到起点的问题。
生日快乐
windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩
形蛋糕。现在包括windy一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积
的蛋糕。windy主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块
蛋糕切成两块。这样,要切成 N 块蛋糕,windy必须切 N − 1 次。为了使得每块蛋糕
看起来漂亮,我们要求 N 块蛋糕的长边与短边的比值的最大值最小。你能帮助windy求
出这个比值么?

1 ≤ X, Y ≤ 10000, 1 ≤ N ≤ 10
经典的搜索问题。

发现给的 N 很小,可以每次尝试切一刀。

切一刀有横切和竖切两种,下面讨论横切的情况,竖切同理。

由于每块蛋糕面积必须相同,我们可以枚举将当前这块蛋糕切完之后上半部分需要分给
几个人,以此确定切的位置。每次切完之后,问题就转化为了一个规模更小的子问题,
继续搜索即可。
[UVa10603] Fill
设 3 个杯子的容量分别为 a, b, c,最初只有第 3 个杯子装满了 c 升水,其他两个杯子为
空。最少需要倒多少升水才能让某一个杯子中的水有 d 升呢?如果无法做到恰好 d 升,
就让某一个杯子里的水是 d′ 升,其中 d′ < d 并且尽量接近 d。要求输出最少的倒水量
和目标水量(d 或者 d′ )。

1 ≤ a, b, c, d ≤ 200
经计算发现总的状态数并不是很多,直接bfs即可。

题目要求输出最少的倒水量,那我们在将一个状态加入队列时可以按照已有的倒水量排
序,而不是倒水次数,这个可以使用优先队列来实现。

当从队列中取出元素时,如果发现出现 d 升水,就可以停止搜索,直接输出答案。这样
做其实是搜索树的最后一层没有扩展完全,节约了时间。
埃及分数问题
在古埃及,人们使用单位分数的和(即 1/a,a 是自然数)表示一切有理数。例如,
2/3 = 1/2 + 1/6,但不允许 2/3 = 1/3 + 1/3,因为在加数中不允许有相同的。

对于一个分数 a/b,表示方法有很多种,其中加数少的比加数多的好,如果加数个数相
同,则最小的分数越大越好。

输入整数 a, b(0 < a < b < 500),试编程计算最佳表达式。


迭代加深搜索经典问题。

如果不规定每次枚举的加数分母最大值,那状态数将是无穷大。

可以首先定下一个值,表示当前搜索时加数分母的最大值。不断增加这个值,便可搜索
出所有答案。

这样做正好满足了最小的分数尽量大的要求。
[UVa1374] Power Calculus
输入正整数 n(1 ≤ n ≤ 1000),问最少需要几次乘除法可以从 x 得到 xn ?例如,x31
需要 6 次:x2 = x ∗ x, x4 = x2 ∗ x2 , x8 = x4 ∗ x4 , x16 = x8 ∗ x8 , x32 = x16 ∗
x16 , x31 = x32 /x。计算过程中 x 的指数应当总是正整数。
同样是ID A*。

可以进行一些优化。发现每次都是将指数乘 2,尽量先接近 n。另外,在搜索时可以先


枚举加法操作,再枚举减法,快速逼近给定的 n。
[UVa1602] Lattice Animals
≤ n ≤ 10, 1 ≤ w ≤ h ≤ n),求能放在 w ∗ h 网格里的不同的 n 连
输入 n, w, h(1
块的个数(注意,平移、旋转、翻转后相同的算作一种)。例如,2 ∗ 4 里的 5 连块有 5
种。数据有多组。
n 连块可以由 n − 1 连块增加一个块数得到。

我们可以首先预处理出来 n 连块的所有可能形状,并使其尽量贴近左上角。题目规定平
移、旋转、翻转后相同的算作一种,所以在生成的时候注意判断重复的情况。

预处理完成之后,直接枚举所有 n 连块,判断其长和宽是否小于等于对应的 w 和 h 即
可。

You might also like