传送门

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. 备份字段(CATALOGUE_CODE)

    update am_e4_entry set CATALOGUE_CODE_back=CATALOGUE_CODE; 还原字段 update am_e4_entry a set CATALOGUE_C ...

  2. visual studio 2015 key vs2015密钥

    Visual Studio Professional 2015简体中文版(专业版)KEY:HMGNV-WCYXV-X7G9W-YCX63-B98R2Visual Studio Enterprise 2 ...

  3. AJPFX学习笔记JavaAPI之String类

    学习笔记JavaAPI之String类 [size=10.5000pt]一.所属包java.lang.String,没有子类.特点:一旦被初始化就不可以被改变. 创建类对象的两种方式: String ...

  4. 支付宝-API接口解析-转账到银行

    支付宝-API接口解析-转账到银行 扫码转账 测试地址 解析内容: alipays://platformapi/startapp?appId=09999988&actionType=toCar ...

  5. esp8266 串口通讯

    1.发送 调用uart_init(115200,115200);初始化串口,波特率设置为115200.前面一个是设置uart0的波特率.后面一个是设置.uart的波特率 然后就可以使用uart0_tx ...

  6. Katalon Studio(二) 进阶战の Jenkins集成 analytics.katalon 集成

    本教程只针对Katalon Studio 与CI工具之一Jenkins的集成与脚本集的测试报告可视化简单操作. 1.新建一个job 2.新建一个自由风格的job 3.构建触发器 4.构建Windows ...

  7. JavaScript——responseType

    https://www.cnblogs.com/cdemo/p/5225848.html https://blog.csdn.net/wkyseo/article/details/78232485 异 ...

  8. JavaScript——blob、file、flieReader、createObjectURL

    https://blog.csdn.net/opengl_es/article/details/44336477 https://www.cnblogs.com/hhhyaaon/p/5928152. ...

  9. MVC 附件在线预览

    原因:应客户需求,在系统中浏览附件内容,需要先下载到本地然后打开,对使用造成了不便,要求可以不需下载直接在浏览器中打开减少操作步骤. 领导给了3天时间,最后查找方法,写测试项目,往正式项目添加,测试, ...

  10. Codeforces_789C_(dp)

    C. Functions again time limit per test 1 second memory limit per test 256 megabytes input standard i ...