[NOIP2009] 靶形数独(搜索+剪枝)
题目描述
小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他
们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,
Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。
靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格
高的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1 到 9 的数字。每个数字在每个小九宫格内不能
重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即
每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。(如图)
上图具体的分值分布是:最里面一格(黄色区域)为 10 分,黄色区域外面的一圈(红
色区域)每个格子为 9 分,再外面一圈(蓝色区域)每个格子为 8 分,蓝色区域外面一圈(棕
色区域)每个格子为 7 分,最外面一圈(白色区域)每个格子为 6 分,如上图所示。比赛的
要求是:每个人必须完成一个给定的数独(每个给定数独可能有不同的填法),而且要争取
更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字
的乘积的总和
总分数即每个方格上的分值和完成这个数独时填在相应格上的数字
的乘积的总和。如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为 2829。游戏规定,将以总分数的高低决出胜负。
由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能
够得到的最高分数。
输入输出格式
输入格式:
一共 9 行。每行 9 个整数(每个数都在 0―9 的范围内),表示一个尚未填满的数独方
格,未填的空格用“0”表示。每两个数字之间用一个空格隔开。
输出格式:
输出文件 sudoku.out 共 1 行。
输出可以得到的靶形数独的最高分数。如果这个数独无解,则输出整数-1。
输入输出样例
- sudoku1
- 7 0 0 9 0 0 0 0 1
- 1 0 0 0 0 5 9 0 0
- 0 0 0 2 0 0 0 8 0
- 0 0 5 0 2 0 0 0 3
- 0 0 0 0 0 0 6 4 8
- 4 1 3 0 0 0 0 0 0
- 0 0 7 0 0 2 0 9 0
- 2 0 1 0 6 0 8 0 4
- 0 8 0 5 0 4 0 1 2
- sudoku2
- 0 0 0 7 0 2 4 5 3
- 9 0 0 0 0 8 0 0 0
- 7 4 0 0 0 5 0 1 0
- 1 9 5 0 8 0 0 0 0
- 0 7 0 0 0 0 0 2 5
- 0 3 0 5 7 9 1 0 8
- 0 0 0 6 0 1 0 0 0
- 0 6 0 9 0 0 0 0 1
- 0 0 0 0 0 0 0 0 6
- sudoku1
- 2829
- sudoku2
- 2852
说明
【数据范围】
40%的数据,数独中非 0 数的个数不少于 30。
80%的数据,数独中非 0 数的个数不少于 26。
100%的数据,数独中非 0 数的个数不少于 24。
NOIP 2009 提高组 第四题
- 看完题目,貌似没有什么更好的解决方法,那就搜索了。
- 但是通过观察数据范围,如果没有什么好的搜索策略,复杂度大概为O(sum^9),这不是个理想的策略。
- 简单易想的剪枝策略:一边搜一边判断,大概能优化很多,期望得分60分。
- 通过题意可以得出一个较好的搜索策略:根据每行每列需要搜索的数字个数(即开始数独前未给出数字的格子的个数)统计出来,根据个数从小到大排序,得出一个较好的行列搜索顺序。
- 然后就搜吧!
- 期望得分100分。
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- struct ha{
- int m,cnt;
- } a[];
- struct li{
- int m,cnt;
- } b[];
- bool cmp1(const ha x,const ha y) {
- return (x.cnt>y.cnt);
- }
- bool cmp2(const li x,const li y) {
- return x.cnt>y.cnt;
- }
- const int w[][]=
- {,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,};
- const int num[][]=
- {,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,};
- int n=,x,tot,kashi,ans=-,sum=,map[][],quex[],quey[];
- bool f[][],hang[][],lie[][],ge[][],wujie,ka;
- void dfs(int u,int v) {
- if (u>n) {
- ans=max(ans,sum);
- return;
- }
- int x=a[u].m;
- int y=b[v].m;
- if (f[x][y]) {
- if (v<n) dfs(u,v+); else dfs(u+,);
- return;
- }
- for (int i=; i<=; i++) {
- if (hang[x][i]) continue;
- if (lie[y][i]) continue;
- if (ge[num[x][y]][i]) continue;
- hang[x][i]=;
- lie[y][i]=;
- ge[num[x][y]][i]=;
- sum+=w[x][y]*i;
- if (v<n) dfs(u,v+); else dfs(u+,);
- hang[x][i]=;
- lie[y][i]=;
- ge[num[x][y]][i]=;
- sum-=w[x][y]*i;
- }
- }
- int main() {
- for (int i=; i<=n; i++) {
- for (int j=; j<=n; j++) {
- scanf("%d",&x);
- if (x) {
- a[i].cnt++;
- b[j].cnt++;
- hang[i][x]=;
- lie[j][x]=;
- ge[num[i][j]][x]=;
- sum+=w[i][j]*x;
- f[i][j]=;
- }
- }
- }
- for (int i=; i<=n; i++) {
- a[i].m=i;
- b[i].m=i;
- }
- sort(a+,a+n+,cmp1);
- sort(b+,b+n+,cmp2);
- //for (int i=1; i<=n; i++) printf("%d ",a[i].m);
- //for (int i=1; i<=n; i++) printf("%d ",b[i].m);
- dfs(,);
- printf("%d",ans);
- return ;
- }
[NOIP2009] 靶形数独(搜索+剪枝)的更多相关文章
- [NOIP2009]靶形数独 题解
407. [NOIP2009] 靶形数独 时间限制:5 s 内存限制:128 MB [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低. ...
- NOIP2009靶形数独[DFS 优化]
描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...
- [NOIP2009] 靶形数独(搜索)
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士 ...
- NOIP2009靶形数独
题目描述: 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“ ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- NOIP2009靶形数独(暴搜)
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明 ...
- NOIP2009 靶形数独
4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...
- Vijos1775 CodeVS1174 NOIP2009 靶形数独
靶形数独 描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教, Z 博士拿出了他最近发 ...
- [NOIP2009] 靶形数独 骚气的大爆搜
这两天OD留的题是搜索,这个东西,就是历年的NOIP压轴题嘛.做了几道什么斗地主啊啥的,感觉还是这题我还懂点. 这道题的搜(xia)索(da)思路是这样的:预处理出一切能处理的东西. 数独大家都了解吧 ...
随机推荐
- VB.NET vs. C#
VB.NET Program Structure C# Imports System Namespace Hello Class HelloWorld Overloads Shar ...
- Navicat for mysql 破解
想用navicat for mysql 连接mysql,发现只能试用30天,感觉挺不爽的,购买的话发现价格一千多,好贵的软件. 所以想要破解一下,网上试了一些方法不行,最后找到了一种方法可以的 破解工 ...
- Js获取下拉框选定项的值和文本
Js获取下拉框的值和文本网上提供了2种方法:但有些人很不负责任,他们根本没考虑到浏览器之间的差异导致的错误,导致很多新手琢磨了半天找不出错误! 下面我总结下Firefox和IE下获取下拉框选定项的值和 ...
- 【bzoj1098】办公楼
[bzoj1098]办公楼 题意 FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄 ...
- mybatis批量更新 UPDATE mysql
oracle和mysql数据库的批量update在mybatis中配置不太一样: oracle数据库: <update id="batchUpdate" parameterT ...
- 自己封装的一个java图片验证码
验证码生成器: package com.lz.Tools; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; ...
- iOS开发UI篇—控制器的创建
iOS开发UI篇—控制器的创建 说明:控制器有三种创建方式,下面一一进行说明. 一.第一种创建方式(使用代码直接创建) 1.创建一个空的IOS项目. 2.为项目添加一个控制器类. 3.直接在代理方法中 ...
- juqery easyui
私人做程序开发一直有个头疼的问题就是后台管理界面,以前一般都是自己用jquery+ps自己设计的,效果很一般,很不理想. 今天初次使用Jquery EasyUi,简单的做了个布局页面感觉还不错,给大家 ...
- 关于Elasticsearch单个索引文档最大数量问题
因为ElasticSearch是一个基于Lucene的搜索服务器.Lucene的索引有个难以克服的限制,导致Elasticsearch的单个分片存在最大文档数量限制,一个索引分片的最大文档数量是20亿 ...
- 使用url下载网络图片以及流介绍
使用url下载网络图片的时候,首先需要建立一个URL对象,然后使用一个输入流获取该URL中的内容.之后使用读取该输入流的内容,使用一个输出流写到本地文件中.最后关闭输入和输出流.下面是一个简单的下载代 ...