传送门

75分,太菜,不会优化了,吐了。

几点优化。

1.先搜索容易确定的位置

2.从中心往周围搜

3.枚举数字的时候倒序枚举

4.如果没有枚举到的数字都是最优情况的话也不能比当前ans大就剪枝

5.位运算

#include <cstdio>
#include <iostream>
#include <algorithm>
#define max(x, y) ((x) > (y) ? (x) : (y))
#define tu(i, j) (((i) - 1) / 3 * 3 + ((j) - 1) / 3 + 1) int ans = -1, cnt;
int hang[10], lie[10], jiu[10], shu[10], a[10][10], num[10][10], point[11]; struct node
{
int pt, x, y, z;
node(int pt = 0, int x = 0, int y = 0, int z = 0) : pt(pt), x(x), y(y), z(z) {}
}p[101]; inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} inline bool cmp(node x, node y)
{
return x.z > y.z || (x.z == y.z && x.pt > y.pt);
} inline int pd(int x, int y)
{
if(x == 1 || x == 9 || y == 1 || y == 9) return 6;
if(x == 2 || x == 8 || y == 2 || y == 8) return 7;
if(x == 3 || x == 7 || y == 3 || y == 7) return 8;
if(x == 4 || x == 6 || y == 4 || y == 6) return 9;
return 10;
} inline bool check(int sum)
{
int i, j, k, top;
k = 10;
top = point[k];
for(i = 9; i >= 1; i--)
for(j = 1; j <= 9 - shu[i]; j++)
if(top) top--, sum += i * k;
else
{
while(!top && k > 6) k--, top = point[k];
top--;
sum += i * k;
}
return sum > ans;
} inline void dfs(int x, int y, int k, int sum)
{
if(k > cnt)
{
ans = max(ans, sum);
return;
}
for(int i = 9; i >= 1; i--)
if(!(hang[x] & (1 << i - 1)) && !(lie[y] & (1 << i - 1)) && !(jiu[tu(x, y)] & (1 << i - 1)))
{
shu[i]++;
point[pd(x, y)]--;
lie[y] |= 1 << i - 1;
hang[x] |= 1 << i - 1;
jiu[tu(x, y)] |= 1 << i - 1;
if(check(sum + p[k].pt * i)) dfs(p[k + 1].x, p[k + 1].y, k + 1, sum + p[k].pt * i);
jiu[tu(x, y)] ^= 1 << i - 1;
hang[x] ^= 1 << i - 1;
lie[y] ^= 1 << i - 1;
point[pd(x, y)]++;
shu[i]--;
}
} int main()
{
int i, j, k, l, x, sum = 0;
point[6] = 32;
point[7] = 24;
point[8] = 16;
point[9] = 8;
point[10] = 1;
for(i = 1; i <= 9; i++)
for(j = 1; j <= 9; j++)
{
shu[a[i][j] = read()]++;
sum += a[i][j] * pd(i, j);
if(a[i][j])
{
point[pd(i, j)]--;
lie[j] |= 1 << a[i][j] - 1;
hang[i] |= 1 << a[i][j] - 1;
jiu[tu(i, j)] |= 1 << a[i][j] - 1;
}
}
for(i = 1; i <= 9; i++)
for(j = 1; j <= 9; j++)
{
for(k = 1; k <= 9; k++)
if(a[i][k] && k != j)
num[i][j]++;
for(k = 1; k <= 9; k++)
if(a[k][j] && k != i)
num[i][j]++;
for(k = 1; k <= 9; k++)
for(l = 1; l <= 9; l++)
if(tu(i, j) == tu(k, l) && a[k][l] && !(i == k && j == l))
num[i][j]++;
}
for(i = 1; i <= 9; i++)
for(j = 1; j <= 9; j++)
if(!a[i][j])
p[++cnt] = node(pd(i, j), i, j, num[i][j]);
std::sort(p + 1, p + cnt + 1, cmp);
dfs(p[1].x, p[1].y, 1, sum);
printf("%d\n", ans);
return 0;
}

  

[luoguP1074] 靶形数独(搜索)的更多相关文章

  1. [LuoguP1074]靶形数独_搜索

    靶形数独 题目链接:https://www.luogu.org/problem/P1074 数据范围:略. 题解: 传说中的大爆搜题啊. 我觉得这种题就是你能想到什么优化就直接上什么优化.... 这个 ...

  2. 洛谷P1074 靶形数独 [搜索]

    题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...

  3. [NOIP2009] 靶形数独(搜索+剪枝)

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  4. 靶形数独 2009年NOIP全国联赛提高组(搜索)

    靶形数独 2009年NOIP全国联赛提高组  时间限制: 4 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 小城和小华都是热爱数 ...

  5. [NOIP2009] 靶形数独(搜索)

    P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士 ...

  6. NOIP2009靶形数独[DFS 优化]

    描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...

  7. 【CodeVS】p1174 靶形数独

    题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士 ...

  8. 靶形数独 (codevs 1174)题解

    [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的“ ...

  9. NOIP2009 靶形数独

    4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...

随机推荐

  1. vue watch监听对象及对应值的变化

    data:{ a:1, b:{ value:1, type:1, } }, watch:{ a(val, oldVal){//普通的watch监听 console.log("a: " ...

  2. PHP + ORACLE 远程连接数据库环境配置

    在ORACLE官网下载instantclient_11_2,放在D盘 把instantclient_11_2目录下的所有dll文件复制到C:\Windows\SysWOW64   和  D:\phpS ...

  3. absolute元素水平居中

    原始(未居中): .con{ width:200px; height:200px; background:#ccc; position:relative; } .abs{ width:40px; he ...

  4. 提交应用 Windows Phone的应用程序认证要求

    本文介绍了 Windows Phone 应用程序或游戏要通过认证并在 Windows Phone Marketplace 中发布而必须满足的策略和技术要求. 1.0 计划概述 设计认证过程的一个核心原 ...

  5. window下phpstudy开启redis扩展

    注:一定要注意自己PHP的版本结构是64还是32位的!其次查看PHP Extension Build是NTS or TS! 1.使用phpinfo()函数查看PHP的版本信息,这会决定扩展文件版本(特 ...

  6. leetcode_654. Maximum Binary Tree

    https://leetcode.com/problems/maximum-binary-tree/ 给定数组A,假设A[i]为数组最大值,创建根节点将其值赋为A[i],然后递归地用A[0,i-1]创 ...

  7. python照相机模型与增强现实

    这次试验主要实现以平面和标记物进行姿态估计以及增强现实的应用. 一.以平面和标记物进行姿态估计(1)下面演示的是一个简单例子:如何在一副图像上放置一个立方体,原图如下: (2)先提取两幅JPG图像的S ...

  8. ALTER TRIGGER - 修改一个触发器的定义

    SYNOPSIS ALTER TRIGGER name ON table RENAME TO newname DESCRIPTION 描述 ALTER TRIGGER 改变一个现有触发器的属性. RE ...

  9. bat运行当前路径下程序

    批处理中获取当前路径的方法可能有好几种,具体有几种我没有研究过,本文只是对其中的两种之间的差别进行简单说明 本文涉及的两个当前路径标示为:%cd%.%~dp0 注:我的系统是win7旗舰版,其它系统没 ...

  10. CAS机制总结

    一.简介 CAS机制:(Compare and set)比较和替换 简单来说–>使用一个期望值来和当前变量的值进行比较,如果当前的变量值与我们期望的值相等,就用一个新的值来更新当前变量的值CAS ...