遇事不决打暴力!—— 那些让人感觉“这他妈也能过?”的暴力题集锦(不断更新)

数独 —— 九宫格

首先说一道大多数人应该都很熟悉的题——求解数独。

简单直接粗犷分析地话,这个题目有9 * 9 = 81个未知数,每个数有9种选择,一共是8^81这种复杂度。如果再考虑每个块里面每个数只能出现一次,那可以简化到(9!)^9。

但是实际上考虑到各种剪枝,这个题目写裸的DFS,只要有解,就算是号称“世界上最难的数独”问题都能在1000ms之内求解。这个大多数玩家应该都有过体会。

 

旋转的数独

应该是在某场开火车看到的题,题意是有一个扩展到16*16的数独,字符集是[0-9]+[A-F],其中4*4的16个小块被独立地顺时针旋转了若干次,给了你旋转之后的九宫格局面,问最少多少次逆时针旋转能够将其还原。

该题目中每个小的九宫格都有可以被旋转0-3次,那么一共有4^16种可能。乍一看是绝对会TLE的,但是事实上同样我们可以用一些小技巧来剪枝。其实这个算法直接跑暴力还是很快的,但是我个人是写了一些小的优化。

为了方便描述,把4*4的小块编号
        0 1 2 3
        4 5 6 7
        8 9 a b
        c d e f

我是按照2, 5, 8, 7, a, d, 6, 9, 1,4, b, e, 0, 3, f c的顺序来枚举的,画一下图的话就可以发现这个按顺序枚举的话剪枝效果拔群。以及在枚举的过程中直接用bitset来维护每一行每一列是否0-f都有,效率也比较高

(不过无脑暴力+无脑check据说也是能过,我想多了)

 

扑克牌

这个题好像也是开火车遇到的,题意说给出K张扑克牌,最多52张。扑克牌牌面是1 2 3 4 5 6 7 8 9 T J Q K,每种最多四张。TJQK分别表示10,11,12,13。第一张牌可以随意打出,之后打出的牌上的数字都要整除前面打出过的所有数字的和。

这个题完全无脑暴力可以知道复杂度是52!的,也就是枚举出牌顺序。

题目在现场赛前几个小时基本没有队做,大概是觉得复杂度不对吧。我看完题就想着这个肯定能爆搜,得想办法搞他娘的一炮。于是想到了倒着枚举,从最后一张牌开始枚举。最后所有数字的和是确定的,最后一张牌上的数字肯定要是总和的因子,这样就剪了大量的枝,然后一步一步推下去。

一开始没有看到每个牌最多四张,还怕暴力枚举会被卡,然后就把枚举顺序random_shuffle了一下,按照一个随机的顺序来枚举。事实证明的确比纯暴力快了很多。。但是并没有什么用。

 

Black and White, 2014 ACM/ICPC Beijing Regional

说实话在区域赛题目看到这个还是很震惊的,,印象中北京的题一向靠谱,连续去了两年正准备去第三年。

题目给了一个N*M的国际象棋棋盘,要求用K种颜色染色,满足相邻两格颜色不同以及第 i 种颜色正好使用了ai次。题目保证a1 + a2 + ... + ak = N*M。其中N, M <= 5。

看到这个题我跟队友第一想法是能不能状压DP或者折半查找。。想了想发现不太行,然后想能不能构造。想了半天构造,我灵机一动想到一个构造方法(假算法)!看了看样例好像都行得通,马上开始写了,心中暗暗窃喜。写完交上去发现WA了,冥思苦想半天没想到为什么会错。于是乎准备打暴力对拍,写了个简单的DFS,从左往右从上往下填,唯二的剪枝条件就是相邻格子不同色 + 某个颜色剩下数量*2 > 剩下格子数+1 这么简单的条件。

暴力写完了开始对拍,然后就惊了。发现不对劲啊,错倒是没找出来,倒是发现这暴力跑得飞快。。理论来说这个复杂度有点假了啊。。但是事实面前不得不服。。它就是能过。。有空还仔细研究一下。

阶段性小结(题目还会持续更新)

总而言之就是惊了。可能我对这种暴力算法的复杂度还不是很有概念,很多剪枝算不清楚。的确好多之前看来不可能能过的题暴力都跑得飞快。以后遇到这种类似的题目真的该好好考虑一下爆搜了。。。

剪枝大法好,胜利属于暴力打表老司机。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值