[NOIP2009提高组]靶形数独
题目:洛谷P1074、Vijos P1755、codevs1174。
题目大意:给你一个数独,让你填完这个数独,并要求得分最大,问这个得分是多少(不能填完输出-1)。
每个格子的得分是当前格子所填的数乘格子的分值。
格子的分值如下:
解题思路:暴力搜索。
然而不加优化的搜索是一定会超时的。
我用了这几个优化就过了这道题:
①位运算,用一个九位二进制数来保存每行/列/九宫格中已经用过的数字,则对于一个点,不能用的数字就是它所在行的状态or列的状态or九宫格的状态。
②每次搜索时,找一个能填的数字最少的格子进行搜索。
③register和手动O2(逃
之后只要你不像我一样把求最大值看成最小值,就能AC了。
C++ Code:
#include<cstdio>
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<s)ans=s;
return;
}
int x,y,mn=0x3f3f3f3f;
for(register int i=1;i<=9;++i){
for(register int j=1;j<=9;++j)
if(!sd[i][j]){
int t=hang[i]|lie[j]|kuai[nin[i][j]],js=0;
for(register int k=0;k<9;++k)
js+=!(t&(1<<k));
if(js<mn)mn=js,x=i,y=j;
if(js==1)break;
}
if(mn==1)break;
}
if(mn==0x3f3f3f3f)return;
int t=hang[x]|lie[y]|kuai[nin[x][y]];
for(register int k=9;k;--k)
if(!(t&(1<<(k-1)))){
int f=1<<(k-1);
hang[x]^=f;
lie[y]^=f;
sd[x][y]=k;
kuai[nin[x][y]]^=f;
dfs(s+sco[x][y]*k,p+1);
hang[x]^=f;
sd[x][y]=0;
lie[y]^=f;
kuai[nin[x][y]]^=f;
}
}
int main(){
ans=-1;
int s=0,p=0;
for(int i=1;i<=9;++i){
for(int j=1;j<=9;++j){
int& now=sd[i][j];
scanf("%d",&now);
if(now)s+=now*sco[i][j],++p,hang[i]|=1<<(now-1),lie[j]|=1<<(now-1),kuai[nin[i][j]]|=1<<(now-1);
}
}
dfs(s,p);
printf("%d\n",ans);
return 0;
}
[NOIP2009提高组]靶形数独的更多相关文章
- P1074 [NOIP2009 提高组] 靶形数独
#include<bits/stdc++.h> using namespace std; const int N=10; int a[N][N],ans[N][N],vis[3][N][N ...
- 洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)
传送门 解题思路 很长的题,实际上在一个有向图(点有点权)中求一个从起点1到终点n的路径,使得这条路径上点权最大的点与点权最小的点的差值最大(要求必须从点权较小的点能够走到点权较大的点). ——最短路 ...
- [NOIP2009] 提高组 洛谷P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- Noip2009提高组总结
Noip2009的题目还是有一定难度的,主要是搜索和最短路都是我的弱项,不检查第一遍下来只做了150分,还是这句话,素质和读题的仔细程度决定了分数.仔细想想,我们化学老师说的话没错,或许题目你都会做, ...
- noip2009提高组解题报告
NOIP2009潜伏者 题目描述 R 国和S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历尽艰险后,潜伏于 S 国的R 国间谍小C 终于摸清了S 国军用密码的编码规则: 1. S 国 ...
- noip2009提高组题解
NOIP2009题解 T1:潜伏者 题目大意:给出一段密文和破译后的明文,一个字母对应一个密文字母,要求破译一段密文,如果有矛盾或有未出现密文无法破译输出failed,否则输出明文. 思路:纯模拟题 ...
- [NOIP2009] 提高组 洛谷P1073 最优贸易
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- [NOIP2009] 提高组 洛谷P1071 潜伏者
题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...
- [NOIP2009] 提高组 洛谷P1072 Hankson 的趣味题
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...
随机推荐
- Objective-C —内存管理(上)
内存管理 一.为什么要进行内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 下列行为都会增加一个app的内存占用 创建一个OC对象 定义一个变量 调用一个函数或者方法 内存占用多大 ...
- HD-ACM算法专攻系列(11)——Exponentiation
问题描述: 源码: 考察对大数的计算,需要注意去除前导0与后导0. import java.math.BigDecimal; import java.util.*; public class Main ...
- C#.Net版本自动更新程序及3种策略实现
C#.Net版本自动更新程序及3种策略实现 C/S程序是基于客户端和服务器的,在客户机编译新版本后将文件发布在更新服务器上,然后建立一个XML文件,该文件列举最新程序文件的版本号及最后修改日期.如程序 ...
- 你不知道的JavaScript(八)逻辑运算
JS的逻辑运算结果和其他一些强类型语言差别比较大,也比较容易让人产生困惑,看下面的例子: <script type="text/javascript"> var a = ...
- Android 实现下拉刷新和上拉加载更多的RECYCLERVIEW和SCROLLVIEW
PullRefreshRecyclerView.java /** * 类说明:下拉刷新上拉加载更多的RecyclerView * Author: gaobaiq * Date: 2016/5/9 18 ...
- JavaScript学习——使用JS完成全选和全不选操作
1.我们希望在后台系统实现一个批量删除的操作(全选所有的复选框)和全不选,显示效果如下: 2.步骤分析: 第一步:确定事件(onclick)并为其绑定一个函数(事件绑定到编号前面的复选框里面) 第二步 ...
- Oracle12C查询自建用户(非系统自带)
select username from dba_users where INHERITED='NO';
- XML文件基础,DTD校验文件编写,Schema文件的简单使用
dtd <!-- <!ELEMENT 元素(子元素,...)> --> <!ELEMENT students (student+,cat*) > <!ELEM ...
- [NOIP2012提高组]疫情控制
题目:洛谷P1084.codevs1218.Vijos P1783. 题目大意:有一棵n个节点的,根为1的带权树和m支军队.每支军队可以在一个点上停下,那么从1开始就不能经过这个点了.现在有m支军队已 ...
- caioj 1204 Catalan数(模板)
题目中对卡特兰数的总结很不错 以下copy自题目 Catalan数列:1,1,2,5,14,42,(前面几个要背) 即 h(0)=1,h(1)=1,h(2)=2,h(3)=5...公式:h(n)=C( ...