题目描述 Description
小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他
们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,
Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。
靶形数独的方格同普通数独一样,在 格宽× 格高的大九宫格中有9 个3 格宽× 格
高的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是已知的,根据这些 数字,利用逻辑推理,在其他的空格上填入1 到9 的数字。每个数字在每个小九宫格内不能
重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即
每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。 上图具体的分值分布是:最里面一格(黄色区域)为 分,黄色区域外面的一圈(红
色区域)每个格子为9 分,再外面一圈(蓝色区域)每个格子为8 分,蓝色区域外面一圈(棕
色区域)每个格子为7 分,最外面一圈(白色区域)每个格子为6 分,如上图所示。比赛的
要求是:每个人必须完成一个给定的数独(每个给定数独可能有不同的填法),而且要争取
更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字
的乘积的总和。如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为2829。游
戏规定,将以总分数的高低决出胜负。 由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能
够得到的最高分数。 输入描述 Input Description
一共 行。每行9 个整数(每个数都在0— 的范围内),表示一个尚未填满的数独方
格,未填的空格用“”表示。每两个数字之间用一个空格隔开。 输出描述 Output Description
输出可以得到的靶形数独的最高分数。如果这个数独无解,则输出整数-。 样例输入 Sample Input
【输入输出样例 】 【输入输出样例 】 样例输出 Sample Output
【输入输出样例 】 【输入输出样例 】 数据范围及提示 Data Size & Hint
【数据范围】
%的数据,数独中非0 数的个数不少于30。
%的数据,数独中非0 数的个数不少于26。
%的数据,数独中非0 数的个数不少于24。

题目

芒果君:爆搜里我认为很经典的题目,为了达到时限我也重构+调试了若干个小时,就说说自己的思路。

刚开始肯定都是正搜(左上到右下),没想到数据问题,倒搜快了好多,那我就想,能不能将9*9划分成四个象限(5*5),再判断搜索的起始点,不过比之前更慢了OTZ

之后看了一下题解,发现自己一直局限在某个角,而没有全局的看整个棋盘,接着就是不断地重构调试……

最后到极限……这是codevs上最慢的一个点了--> 测试点#sudoku20.in 结果:<label>AC</label> 内存使用量: 256kB 时间使用量: 222ms

O_o  ->每个空格子的信息——横纵坐标和初始有哪些数可选,红字部分是剪枝的要点,预处理,之后我们的每次填数肯定都要看这个大的格局。贪心的,每次我们找到出度(可选的数)最小的格子去搜,但这个出度不能为0,如果为0就说明不能填了对不对w 如果为1呢,一定去填这个格子,直接跳出。

其实借鉴了别人的思想,但如果每次都在9*9*9范围内找显然有许多不必要的操作,我的优化就在于把寻找的范围缩小到每个空格和初始能填的数,用结构体存,比如(1,1)一开始能填的数是(1,2,3),那我只要看这3个数而不用再把一到九找一遍,然后还有毫无卵用的位运算,就缩了一点空间……还有更无卵用的register和inline什么鬼2333333

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define calg(x,y) ((x-1)/3)*3+(y-1)/3+1
using namespace std;
int cnt,ans=-,now,vis[],score[][][],mp[][],MP[][],r[],c[],g[],w[][]={{},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,}};
struct Ge{
int x,y,ccnt;
int list[];
}O_o[];
inline int read()
{
int ret=;
char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<=''){
ret=ret*+ch-'';
ch=getchar();
}
return ret;
}
bool cmp(Ge X,Ge Y)
{
if(X.ccnt!=Y.ccnt) return X.ccnt<Y.ccnt;
if(X.x!=Y.x) return X.x<Y.x;
return X.y<Y.y;
}
inline bool fill(register int x,register int y,register int val)
{
if(r[x]&(<<val)||c[y]&(<<val)||g[calg(x,y)]&(<<val)) return false;
r[x]|=<<val,c[y]|=<<val,g[calg(x,y)]|=<<val;
now+=score[x][y][val];
return true;
}
void dfs(register int f,register int sum)
{
if(sum>cnt){
ans=max(now,ans);
return;
}
vis[f]=;
register int x=O_o[f].x,y=O_o[f].y,flg=;
for(register int j=;j<=O_o[f].ccnt;++j){
register int i=O_o[f].list[j],minx=,zb=;
if(fill(x,y,i)){
flg=;
for(int k=;k<=cnt;++k){
if(vis[k]) continue;
int cd=O_o[k].ccnt,xx=O_o[k].x,yy=O_o[k].y;
for(int l=;l<=O_o[k].ccnt;++l){
int nnum=O_o[k].list[l];
if(r[xx]&(<<nnum)||c[yy]&(<<nnum)||g[calg(xx,yy)]&(<<nnum)) cd--;
}
if(!cd){
flg=;
break;
};
if(cd<minx){
minx=cd;
zb=k;
}
if(cd==) break;
}
if(flg) dfs(zb,sum+);
r[x]^=<<i,c[y]^=<<i,g[calg(x,y)]^=<<i;
now-=score[x][y][i];
}
}
vis[f]=;
}
int main()
{
//freopen("sudoku.in","r",stdin);
//freopen("sudoku.out","w",stdout);
for(int i=;i<=;++i)
for(int j=;j<=;++j)
for(int k=;k<=;++k)
score[i][j][k]=w[i][j]*k;
for(int i=;i>;--i)
for(int j=;j>;--j){
mp[i][j]=read();
fill(i,j,mp[i][j]);
}
for(int i=;i<=;++i)
for(int j=;j<=;++j){
if(mp[i][j]) continue;
O_o[++cnt].x=i;
O_o[cnt].y=j;
for(int k=;k<=;++k){
if(r[i]&(<<k)||c[j]&(<<k)||g[calg(i,j)]&(<<k)) continue;
else O_o[cnt].list[++O_o[cnt].ccnt]=k;
}
}
sort(O_o+,O_o+cnt+,cmp);
dfs(,);
printf("%d",ans);
return ;
}

NOIp 2009:靶形数独的更多相关文章

  1. NOIP 2009 靶形数独(DLX)

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

  2. [NOIp 2009]靶形数独

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

  3. [COGS 0407][NOIP 2009] 靶形数独

    407. [NOIP2009] 靶形数独 ★★   输入文件:sudoku.in   输出文件:sudoku.out   简单对比时间限制:5 s   内存限制:128 MB [问题描述] 小城和小华 ...

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

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

  5. 【NOIP 2009】靶形数独

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

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

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

  7. 靶形数独(codevs 1174)

    1174 靶形数独 2009年NOIP全国联赛提高组  时间限制: 4 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descri ...

  8. 洛谷 P1074 靶形数独 Label:search 不会

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

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

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

随机推荐

  1. Yarn 配置阿里源

    1.查看一下当前源 yarn config get registry 2.切换为淘宝源 yarn config set registry https://registry.npm.taobao.org ...

  2. Mina学习+手写服务端+通过telnet连接服务端

    1. 2. 3. 4.MinaServer.java package com.mina; import java.io.IOException;import java.net.InetSocketAd ...

  3. 内存原理与PHP的执行过程

    一.内存结构 栈区:保存的是变量名(术语:引用),对于cpu来说,读写速度很快 堆区:存储“复杂”的数据,数组.对象.字符串(字符串比较特殊)等 数据段:又分为数据段全局区(用于存储简单的数据,如数字 ...

  4. [HNOI2002]营业额统计 II

    https://www.luogu.org/problemnew/show/2234 将权值离散化,以权值为下标建立权值线段树 #include <bits/stdc++.h> using ...

  5. 代码 | 自适应大邻域搜索系列之(7) - 局部搜索LocalSearch的代码解析

    前言 好了小伙伴们我们又见面了,咳咳没错还是我.不知道你萌接连被这么多篇代码文章刷屏是什么感受,不过,酸爽归酸爽.今天咱们依然讲代码哈~不过今天讲的依然很简单,关于局部搜索LocalSearch的代码 ...

  6. macOs下安装Android SDK

    首先下载 Android SDK for mac 配置安装 1.进入存放 android-sdk-macosx 的目录,然后输入./android sdk就可以调出SDK Manager的图形界面 A ...

  7. ML_Review_GMM(Ch10)

    Note sth about GMM(Gaussian Mixtrue Model) 高斯混合模型的终极理解 高斯混合模型(GMM)及其EM算法的理解 这两篇博客讲得挺好,同时讲解了如何解决GMM参数 ...

  8. Go 语言入门(二)方法和接口

    写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于A tour of Go编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(二 ...

  9. Mac地址转换成long长整型

    Mac地址转换成long长整型 using System;using System.Collections.Generic;using System.IO;using System.Text;usin ...

  10. 远程控制软件 mRemoteNG,管理多台虚拟机

    #下载 1.官网下载:https://mremoteng.org/2.当然也可以到这里下载:https://pan.baidu.com/s/11O_QNM3HudN3IyTiqqHmrQ,提取码:jm ...