P2346 四子连棋 题解

博客园同步

原题链接

2020.4.1

在这里立个 flag \text{flag} flag:一周内 AC \texttt{AC} AC 不了这道题目,我就 倒 ! 立 ! 洗 ! 头 !

本人还没 AC \texttt{AC} AC,不过呢,谔谔,先整理下思路吧。

简要题意:

给定一个棋局,双方轮流将自己的棋子走到空位(任意方先走),问使得“四子连棋”(即四个子在一条直线上,斜线也可以)的最小步数。

显然, 4 × 4 4 \times 4 4×4 的棋盘只要不出问题就能 AC \text{AC} AC.(但我。。。)

本题需要优化搜索!(其实不然)

假设你用纯属的 bfs \texttt{bfs} bfs,旁边开着哈希,你完全 有可能将所有状态都遍历一遍

而所有状态的种数是(根据组合计算):

16 ! 7 ! × 7 ! × 2 ! = 411840 \frac{16!}{7! \times 7! \times 2!} = 411840 7!×7!×2!16!=411840

然后,你映射到哈希还需要 4 2 = 16 4^2 = 16 42=16 的时间,然后还要每次判断答案再用 4 2 = 16 4^2 = 16 42=16 的时间,其它的不说,时间复杂度达到了:

O ( 4 × 1 0 5 × 1 6 2 ) > O ( 1 0 8 ) O(4 \times 10^5 \times 16^2) > O(10^8) O(4×105×162)>O(108)

再快的评测机,你广搜的常数也不会小的,然后妥妥的 T \text{T} T 掉了。。

你说:好,我用双向 bfs \text{bfs} bfs.

没错确实可以,但这边不讲 究竟是懒,还是博主不会,大家细细品!

那么 A* \text{A*} A* 是什么呢?(这么神秘)

其实, A* \text{A*} A* 的搜索可以保证每次的状态越来越优(至少也不会变劣)。

假设当前状态为 x x x,转移状态为 y y y对状态的咕值函数为 f f f(没错就是这个咕,咕咕咕的咕),则必须满足:

f x ≤ f y f_x \leq f_y

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值