kuangbin带你飞 专题一 简单搜索 (题解)

本文解析了多个经典的ACM算法题,包括翻转棋盘、寻找特定倍数、复杂BFS应用等,并提供了详细的解题思路及代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

POJ 3279 

题意:黑白的板,每次选择一个十字形翻转(十字板内黑白互换,若是边界则不管),求最小将原图变为全白的策略。

题解:枚举第一行翻转情况(二进制),2^c,然后验证,由于第一行确定了,后面就可以跟着确定了。

尽量不要直接翻转初始状态,不然会影响后续的情况(我被坑了好几个小时)。如下判断:

int get(int x,int y)//(x,y)的颜色  
{  
    int res=map[x][y];  
    for(int i=0;i<5;i++)  
    {  
        int a=x+dx[i],b=y+dy[i];  
        if(a>=0&&a<m&&b>=0&&b<n)  
        {  
            res+=flip[a][b];  
        }  
    }  
    return res&1;  
}  

POJ 1426

题意:找n的倍数,这个倍数的数字只有0或1;

题解:这个倍数有100位,每次余数乘10之后+0或者+1,有两种情况,可以用BFS做。

用三维数组pre[][][]存状态,第一维是余数,第二维是此时的位数,第三维是当前位是0还是1,pre的值为前一个状态

void dabiao(){
    for(int n=1;n<=200;n++){
        memset(pre,-1,sizeof(pre));
        queue<int> q;
        int m=1%n;
        pre[m][1][1]=-1;
        q.push(m*10000+10+1);
        while(!q.empty()){
            int t=q.front();
            int x=t/10000;
            int y=(t-10000*x)/10;
            int z=t-10000*x-10*y;
            q.pop();
            if(x==0){
                cun(t,n);
                break;
            }
            for(int i=0;i<2;i++){
                m=(x*10+i)%n;
                pre[m][y+1][i]=t;
                q.push(m*10000+(y+1)*10+i);
            }
        }
    }
}

POJ  3414 pots

这个题应该比较明显是BFS,不过状态记录有点烦, 我开了int pre[105][105][5][30] 这样的四位数组记录状态。。。


FZU 2150

比较繁琐的BFS,wa了好多次没有发现错误。

题意 :就是有两个熊孩子要把一个正方形上的草都给烧掉,他俩同时放火烧,烧第一块的时候是不花时间的,每一块着火的都可以在下一秒烧向上下左右四块#代表草地,.代表着不能烧的。问你最少花多少时间可以烧掉,如果烧不掉就输出-1

思路 :先BFS判断有几个连通块,大于2输出-1,等于2时,就分别求出两个连通块里的最短时间然后取最大,等于1时,就遍历在一个连通块里任意两个点(可以相同)都放进队列里BFS(写的时候失误太多)

UVa 11642

真是题题trick,此题不造我哪里错了,无法理解,题解是火和人一起放进queue里,然后火先走,人走出去的时候就是可以



HDU  1495

这题的题意就是个大坑。题目是非常的简单

trick:   题目中只说要平分可乐,但实际上本题对于最终实现平分的方式也是有要求的,那就是最终在S中必须有S/2单位的可乐,且过程中不能提前喝可乐。

例如 4 1 3 这组数据,只要从4倒到3,再从3倒到1,一共倒2次就能够得到2单位的可乐了(存放在M中),但样例中给的答案是倒3次,也就是要把N中那1单位的可乐倒回S中才行。

再比如 6 1 1 这组数据,其实我可以每次从S(S=6)中倒出1单位的可乐到N或M中,再把它喝掉,如此循环3次就可以实现平分可乐,但这种平分的方式也不被本题所允许。


### 关于 kuangbin ACM 算法竞赛培训计划 #### 数论基础专题介绍 “kuangbin专题十四涵盖了数论基础知识的学习,旨在帮助参赛者掌握算法竞赛中常用的数论概念和技术。该系列不仅提供了丰富的理论讲解,还推荐了本详细的书籍《算法竞赛中的初等数论》,这本书包含了ACM、OI以及MO所需的基础到高级的数论知识点[^1]。 #### 并查集应用实例 在另个具体的例子中,“kuangbin”的第五个专题聚焦于并查集的应用。通过解决实际问题如病毒感染案例分析来加深理解。在这个场景下,给定组学生及其所属的不同社团关系图,目标是从这些信息出发找出所有可能被传染的学生数目。此过程涉及到了如何高效管理和查询集合成员之间的连通性问题[^2]。 #### 搜索技巧提升指南 对于简单搜索题目而言,在为期约两周的时间里完成了这部分内容的学习;尽管看似容易,但对于更复杂的状况比如状态压缩或是路径重建等问题,则建议进步加强训练以提高解题能力[^3]。 ```python def find_parent(parent, i): if parent[i] == i: return i return find_parent(parent, parent[i]) def union(parent, rank, x, y): rootX = find_parent(parent, x) rootY = find_parent(parent, y) if rootX != rootY: if rank[rootX] < rank[rootY]: parent[rootX] = rootY elif rank[rootX] > rank[rootY]: parent[rootY] = rootX else : parent[rootY] = rootX rank[rootX] += 1 # Example usage of Union-Find algorithm to solve the virus spread problem. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值