[NOIP2009提高组]靶形数独

题目:洛谷P1074、Vijos P1755、codevs1174。

题目大意:给你一个数独,让你填完这个数独,并要求得分最大,问这个得分是多少(不能填完输出-1)。

每个格子的得分是当前格子所填的数乘格子的分值。

格子的分值如下:[NOIP2009提高组]靶形数独_第1张图片

解题思路:暴力搜索。

然而不加优化的搜索是一定会超时的。

我用了这几个优化就过了这道题:

①位运算,用一个九位二进制数来保存每行/列/九宫格中已经用过的数字,则对于一个点,不能用的数字就是它所在行的状态or列的状态or九宫格的状态。

②每次搜索时,找一个能填的数字最少的格子进行搜索。

③register和手动O2(逃

之后只要你不像我一样把求最大值看成最小值,就能AC了。

C++ Code:

#include
using namespace std;
int nin[10][10]={{0},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9}
},sco[10][10]={{0},
{0,6,6,6,6,6,6,6,6,6},
{0,6,7,7,7,7,7,7,7,6},
{0,6,7,8,8,8,8,8,7,6},
{0,6,7,8,9,9,9,8,7,6},
{0,6,7,8,9,10,9,8,7,6},
{0,6,7,8,9,9,9,8,7,6},
{0,6,7,8,8,8,8,8,7,6},
{0,6,7,7,7,7,7,7,7,6},
{0,6,6,6,6,6,6,6,6,6},
};
int sd[10][10],hang[10]={0},lie[10]={0},kuai[10]={0},ans;
__attribute__((optimize("-O2")))void dfs(int s,int p){
	if(p==81){
		if(ans

 

转载于:https://www.cnblogs.com/Mrsrz/p/7762674.html

你可能感兴趣的:([NOIP2009提高组]靶形数独)