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