[题目] Section 2.1 The Castle(USACO)

[题目] Section2.1 The Castle

[题意] 城堡由一个个的房间组成,有的房间之间存在墙,有的房间之间不存在墙。不存在墙的房间看作一个房间。给出这个城堡的地图,你的任务是算出房间数、最大的房间的大小、推倒一个墙之后最大的房间大小、要推倒的那面墙的位置。其中这个地图的表示方式有点奇葩。。1表示在西面有墙,2表示在北面有墙,4表示在东面有墙,8表示在南面有墙,而用他们的和表示这个房间的墙的情况

[算法]FloodFill(种子染色法)

         关于FloodFill的理解:

         这次终于能把usaco上关于FloodFill的介绍好好的读一遍了。FloodFill,即种子染色法。

它的原理是,寻找一个结点,遍历与它相通的结点,都标上相同的标号,然后在寻找一个未被标记的结点,再重复此过程。这样标号相同的结点就是一个联通子图了。

FloodFill有多种实现方式,包括BFS,DFS等。DFS通过递归实现,BFS通过把结点加入队列中实现。


 

[思路] 关于数据的处理,比如[1,1]这个节点,有墙的方向是北、南、西,也就是1+2+8=11,而11的二进制表示是1011,所以就可以用二进制的哪一位是0或1表示对应方向有墙和没墙。如何实现通过二进制判断呢?位运算&解决。比如11&1就是判断11转化为二进制后第一位是不是0,11&2是第二位,11&4是第三位,11&8第4位,依次类推。数据处理完之后,再DFS找出所有联通子图。到此为止房间个数和最大房间面积就能算出来了。然后再遍历每一座墙,如果墙的两边不属于同一个房间,就把它推倒算出推倒后的面积。通过遍历不断更新最大面积,最后得出的解就是最优解。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值