1.洛谷 P1074 [NOIP2009 提高组] 靶形数独
(大意:给定一个9*9的方格,有0-9的数字,在0的位置填上1~9的数字,保证每行,每列,每个3 *3方格中每个数字出现一次,此外,完成数独会有一个分数,分数的计算方式:每个位置有固定的分数,类似于打靶,越中间分数越大,求所有位置的数乘以该位置的分数的和的最大值。)
思路:不考虑分数就是Acwing上面的数独,但是考虑分数怎么办? 一开始想错了,想的是从最里面开始从大数开始放,其实没这么麻烦,纪录一个全局最大值就行了,每次找到一种可行方案就更新下最大值。就爆搜嘛,别难为自己。
数独的剪枝 (1)巧妙之处:位运算优化,因为每次要看哪个位置能填哪个数,要考虑行、列、单元格,还要考虑哪个数字,很麻烦。但想到总共就9个数字,每个数字能填不能和不能填两种状态。 嗯 ? 状态压缩?1表示能填,0表示不能填,考虑该位置能不能填某个数,只需要把行、列、单元格的状态&运算就行了。1代表该数字能填。但是我们填数是每次都去找哪个位置是1会重复很多次寻找,所以想到通过预处理,把某个状态的什么位置是1先找好,mp[1<<i]=i; 这样只需要利用 lowbit运算就可以很快找到要填的数字是几?(2)优化搜索顺序:每次优先搜索分支较少的点,即每次优先搜索可填的数较少的点,自然想到预处理出每种状态中1的个数。(3)可行性剪枝。