NOIP2009靶形数独[DFS 优化]
描述
小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他
们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,
Z 博士拿出了他最近发明的“靶形数独” ,作为这两个孩子比试的题目。
靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格
高的小九宫格(用粗黑色线隔开的) 。在这个大九宫格中,有一些数字是已知的,根据这些
数字,利用逻辑推理,在其他的空格上填入 1到 9 的数字。每个数字在每个小九宫格内不能
重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即
每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。 (如图) 
上图具体的分值分布是:最里面一格(黄色区域)为 10 分,黄色区域外面的一圈(红
色区域)每个格子为 9 分,再外面一圈(蓝色区域)每个格子为 8分,蓝色区域外面一圈(棕
色区域)每个格子为 7分,最外面一圈(白色区域)每个格子为 6 分,如上图所示。比赛的
要求是:每个人必须完成一个给定的数独(每个给定数独可能有不同的填法) ,而且要争取
更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字
的乘积的总和。如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为 2829。游
戏规定,将以总分数的高低决出胜负。 
由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能
够得到的最高分数。
格式
输入格式
一共 9 行。每行 9 个整数(每个数都在 0—9 的范围内) ,表示一个尚未填满的数独方
格,未填的空格用“0”表示。每两个数字之间用一个空格隔开。
输出格式
输出可以得到的靶形数独的最高分数。如果这个数独无解,则输出整数-1。
样例1
样例2
限制
每个测试点2s
提示
40%的数据,数独中非 0数的个数不少于 30。
80%的数据,数独中非 0数的个数不少于 26。
100%的数据,数独中非 0 数的个数不少于 24。
来源
NOIP 2009
搜索每个位置填什么就可以了,用r,l,c分别判断行列九宫格是否合法
据说卡正序,可以倒过来
注释掉的那块按普通的顺序一行行搜
没注释掉的dfs配合了getnxt,得到当前可能填的方案最少的格子,从这个格子开始
//
// main.cpp
// noip2009靶形数独
//
// Created by Candy on 10/2/16.
// Copyright © 2016 Candy. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
//#define dfsnxt(x,y) y==9?dfs(x+1,1):dfs(x,y+1)
const int N=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x;
}
int a[N][N];
int r[N][N],l[N][N],c[N][N],score=,ans=;
int vis[N][N];
inline int id(int x,int y){return (x-)/*+(y-)/+;}
int v[][] = {
{, , , , , , , , },
{, , , , , , , , },
{, , , , , , , , },
{, , , , , , , , },
{, , , , , , , , },
{, , , , , , , , },
{, , , , , , , , },
{, , , , , , , , },
{, , , , , , , , }
};
inline int mark(int x,int y){return v[x-][y-];}
inline bool fil(int x,int y,int k){
if(r[x][k]||l[y][k]||c[id(x,y)][k]) return ;
r[x][k]=l[y][k]=c[id(x,y)][k]=;
score+=k*mark(x,y);
vis[x][y]=;
return ;
}
inline void del(int x,int y,int k){
r[x][k]=l[y][k]=c[id(x,y)][k]=;
score-=k*mark(x,y);
vis[x][y]=;
}
void getnxt(int &x,int &y){
int mn=,flag=;
for(int i=;i<=;i++)
for(int j=;j<=;j++) if(!vis[i][j]){flag=;
int cnt=;
for(int k=;k<=;k++)
if(!r[i][k]&&!l[j][k]&&!c[id(i,j)][k]) cnt++;
if(cnt<mn){mn=cnt;x=i;y=j;}
}
if(!flag){x=;y=;}
}
//void dfs(int x,int y){
// if(x==10){ans=max(ans,score);return;}
// if(a[x][y]) dfsnxt(x,y);
// else{
// for(int i=1;i<=9;i++)
// if(fil(x,y,i)){
// dfsnxt(x,y);
// del(x,y,i);
// }
// }
//}
void dfs(int x,int y){
if(x==&&y==){ans=max(ans,score);return;}
for(int i=;i<=;i++)
if(fil(x,y,i)){
int tx=,ty=; getnxt(tx,ty);
dfs(tx,ty);
del(x,y,i);
}
} int main(int argc, const char * argv[]) {
for(int i=;i>=;i--)
for(int j=;j>=;j--){a[i][j]=read();if(a[i][j]) fil(i,j,a[i][j]);}
int x=,y=;getnxt(x,y);
dfs(x,y);
if(ans==) printf("-1");
else printf("%d",ans);
return ;
}
NOIP2009靶形数独[DFS 优化]的更多相关文章
- [NOIP2009]靶形数独 题解
407. [NOIP2009] 靶形数独 时间限制:5 s 内存限制:128 MB [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低. ...
- [NOIP2009] 靶形数独(搜索+剪枝)
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- NOIP2009靶形数独
题目描述: 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“ ...
- NOIP2009 靶形数独
4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...
- P1074 靶形数独 dfs回溯法
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
- [NOIP2009] 靶形数独(搜索)
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士 ...
- Vijos1775 CodeVS1174 NOIP2009 靶形数独
靶形数独 描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教, Z 博士拿出了他最近发 ...
- NOIP2009靶形数独(暴搜)
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明 ...
- [NOIP2009]靶形数独 深搜+枝杈优化
这道题,又是一位玄学搜索...... 我是用的蜗牛序搜的(顾名思义,@,这么搜),我正着搜80然后一反转比原来快了几十倍........一下AC....... 我的思路是这样的话我们可以从内到外或者从 ...
随机推荐
- Ajax中get和post使用问题
使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化: 解决方法:在?后面链接一个num=[随机数Math.rando ...
- 2034-人见人爱A-B(c++实现)
Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法 ...
- Node入门
一 node定位 Node.js是一个事件驱动I/O服务端JavaScript环境,是一个基于Google的V8引擎的Chrome JavaScript 运行时建立的一个平台. 二 node安装 (1 ...
- abap--How to debug backgroud job
最近被一个朋友问起如何调试后台进程(一个abap的面试题),我一时也不知道如何答,他后来告诉我到sdn上找答案,我现在将答案收集供大家参考:Steps 1. Create variant called ...
- FOR ALL ENTRIES IN 与 INNER JOIN 写在一个SQL上影响效率
SELECT likp~vbeln likp~lfart lips~werks likp~kunnr INTO CORRESPONDING FIELDS OF TABLE it_likps FROM ...
- SharePoint 2013 列表关于大数据的测试<二>
1.给测试列表添加查阅项字段,100个,代码如下: 2.插入测试数据的方法,注意查阅项字段的格式,代码如下: 3.插入10w条数据,时间花费如下(不建议List[LISTNAME].Items.Add ...
- 折腾一天的WordPress
自从昨天开始要写博客,在网上找了找大家都比较推崇著名的WordPress,所以自己就闲来无事要坐下测试弄一个,不弄不知道,一弄折磨人啊,公司的破网直接想让我崩溃,所以这一天就在这搭建环境中度过,不过值 ...
- 操作系统开发系列—12.b.从Loader跳入保护模式
现在,内核已经被我们加载进内存了,该是跳入保护模式的时候了. 首先是GDT以及对应的选择子,我们只定义三个描述符,分别是一个0~4GB的可执行段.一个0~4GB的可读写段和一个指向显存开始地址的段: ...
- Android 国际化
由于公司的项目是投放 google play store , 所以要做国际化.国际化遇到的两个大问题 字符串国际化 布局样式国际化 一:字符串国际化 解决这个问题很简单,在res目录下放 ...
- UI中一些不常用的控件UIActivityIndicatorView、UIProgressView、UISegmentedControl、UIStepper、UISwitch、UITextView、UIAlertController
//UIActivityIndicatorView //小菊花,加载 #import "ActivityIndicatorVC.h" @interface ActivityIndi ...