带你飞系列 - 一简单搜索

希望能完成这个系列,提升自己实力。在这里记录下刷题的过程,当作是一种见证。

POJ 1321 棋盘问题

根据题目要求,要求在可行区域放置K个棋子,求所有可能放置的数目。假设已经在点(x,y)上放了一颗棋子,则x所在的行和y所在的列都不能再放置。先考虑K=N的情况,因为放置种类与先后顺序无关,那么假设重第一行开始,每一行有且只能有一颗棋子。那么从第一行开始逐行进行DFS可解。对于N>K的情况下,DFS在进行到K层的时候需要返回,并且DFS起始行从第一行开始变为从第一行到N-K行,每行都进行一遍扫描,累加一下和可解。

POJ 2251 Dungeon Master

3维BFS,状态转移数目从4变成了6,没难度。

POJ 3278 Catch That Cow

我自己的办法是 bfs, 因为能往会走的只有-1这种情况,所以可以将输入分成两部分,K<=N和K>N两种情况。对于K<=N,直接输出N-K就是答案;对于N>K时,则为三种状态的BFS,直接输出结果就好。

在网上找到了一种更好的办法,不做分析,自己看看就好:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int ans,n,k,t,g,h; 
int main() {
    scanf("%d%d", &n, &k);
    t = 0;
    ans = abs(n-k);
    g = k, h = -1; 
    while (g > 1) {
        if (h == -1) {
            if (g & 1) 
                h =(g >> 1) + 1, g >>= 1, t += 2; 
            else 
                g >>= 1, t++; 
        } else {
            if (g&1) 
                g = h >> 1; 
            else 
                g = g>> 1; 
            h = -1; 
            t++;
        }
        ans = min(ans , t + abs(n - g));
        if (h != -1) ans = min(ans, t + abs(n - h));
    }
    printf("%d\n" , ans);
}

POJ 3279 Fliptile

这道题在挑战程序设计上做为例题讲解,所以只是简单提一下。翻动一个格子的时候,会连带着一起翻动周围四个格子,现在想让所有格子都成白色,求翻转方案。如果直接枚举翻转,那么在后面的操作会影响到前面的操作。如果能找到一种方案翻转时只影响到后面的部分,就能解决。注意到如果我们确定了第一行的翻转方案,那么后面能够影响前面部分的只有翻转第二行对应列,这样就实现了翻转的时候只影响到后面的部分,那么只需要一次翻转使得前一行为白色,并判断最后一行是否全部为白色,就能知道是否有翻转方案。这道题目还需要注意到是当第一行确定后,后面的翻转方案也就确定了,所以并不存在字典序的问题。

POJ 1426 Find The Multiple

题目是寻找一个数只为0和1组成的倍数。注意到第一个字只能为一,有了初态,转移态为0和1,依次判断,一次BFS解决。

比如2,初态为1,因为1 % 2 != 0 , 所以1不是2的倍数。继续寻找,在1后面加上0或1,因为 11 % 2 != 0,所以不是继执行上述步骤,而对于10,是2的倍数,找到结果返回。

POJ 3126 Prime Path

每次只能变动一位,且变动后的结果必须是素数。那么对应状态数为40的BFS,即每次变动一位,从0-9,一共四次,判断是否目标值可解。需要注意的是在变动最高位的时候,没有前导零。

POJ 3087 Shuffle’m Up

并不知道怎么广搜,直接 map 模拟AC。

POJ 3414 Pots

将每一种操作看作一种状态,BFS模拟就能通过。重点是在回溯上:我的做法是将原先的入队操作改成压入 vector 中, 并将其索引入队,那么就可以在 vector 的元素中记录下 parent 的索引号。最后,可以通过最后一个元素的 parent 索引逆推回去。

FZU 2150 Fire Game

每次找两个点,压入队列作为其实条件,BFS可解。需要注意的是这两个点可以相同。

UVA 11624 Fire!

和上一题差不多的思路,不过需要注意到的是必须火的坐标先入队于人才能保证不被烧伤。

POJ 3984 迷宫问题

估计是最简单的一道题目了,据说直接输出样例都能AC,还能进榜。。。Orz

HDU 1241 Oil Deposits

DFS求联通块,也是简单题。

HDU 1495 非常可乐

感觉到后面的题目越来越水。。。这里和前面有关于水的题目思路一样,BFS可解。

HDU 2612 Find a way

这种两个点同时BFS的题目已经是第三次了,第一个被另一方扫描到的点就是答案。

总结

DFS没出什么大问题,需要注意的是BFS中的入队优化,以前没太注意,倒是T了不少次。简单搜索还是很水的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值