NOIP2009靶形数独

 

试题描述
小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。
靶形数独的方格同普通数独一样,在 9 格宽 ×9 格高 的大九宫格中有 9 个 3格宽×3 格高 的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1 到 9 的数字。每个数字在每个小九宫格内不能 重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即 每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。(如图)



28.png


上图具体的分值分布是:里面一格(黄色区域)为 10 分,黄色区域外面的一圈(红色区域)每个格子为 9 分,再外面一圈(蓝色区域)每个格子为 8 分,蓝色区域外面一圈(棕色区域)每个格子为 7 分,外面一圈(白色区域)每个格子为 6 分,如上图所示。
比赛的要求是:每个人必须完成一个给定的数独(每个给定数独可能有不同的填法),而且要争取更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和。
如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为 2829 。游戏规定,将以总分数的高低决出胜负。

29.png
由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能够得到的高分数。
输入
输入一共 9 行。每行 9个整数(每个数都在 
0—9 的范围内),表示一个尚未填满的数独方格,未填的空格用 0 表示。每两个数字之间用一个空格隔开。
输出
输出共 1 行。

输出可以得到的靶形数独的高分数。如果这个数独无解,则输出整数 −1 。
输入示例
样例输入 1
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
样例输入 2
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 
输出示例
样例输出 1
2829
样例输出 2
2852

因为我们知道分值是多少,所以可以先打出表格,然后美剧所有的情况,进行判断,最后加点剪枝就可以过

难点在于如何计算出每个数字在哪个宫,(x-1)/3*3+1+(y-1)/3,x代表行,y代表列

还有就是我们OJ是真的慢,最后只好打表QAQ

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
inline int rd()
{int x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;
}
inline void write(int x)
{if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}
const int score[10][10]={{0,0,0,0,0,0,0,0,0,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 map[100][100],row[100][100],col[100][100],gong[100][100];
int rcnt[10000],ccnt[10000];
int cnt=0;
int ans=-1;
int id(int x,int y){return (x-1)/3*3+1+(y-1)/3;}
int check()
{int sum=0;for(int i=1;i<=9;i++) for(int j=1;j<=9;j++) sum+=(score[i][j]*map[i][j]);return sum;
}
void dfs(int r,int c,int sum)
{if(sum==81){ans=max(ans,check());return ;}for(int k=1;k<=9;k++){if(row[r][k]!=0||col[c][k]!=0||gong[id(r,c)][k]!=0) continue;row[r][k]=1;col[c][k]=1;gong[id(r,c)][k]=1;rcnt[r]++;ccnt[c]++;map[r][c]=k;int rr,tmpr=-1,cc,tmpc=-1;for(int j=1;j<=9;j++){if(rcnt[j]>tmpr&&rcnt[j]<9){tmpr=rcnt[j];rr=j;}}for(int j=1;j<=9;j++){if(ccnt[j]>tmpc&&map[rr][j]==0){tmpc=ccnt[j];cc=j;}}dfs(rr,cc,sum+1);row[r][k]=0;col[c][k]=0;gong[id(r,c)][k]=0;map[r][c]=0;rcnt[r]--;ccnt[c]--;}return ;
}
int main()
{int i,j;for(i=1;i<=9;i++){for(j=1;j<=9;j++){map[i][j]=rd();if(map[i][j]!=0){row[i][map[i][j]]=1;col[j][map[i][j]]=1;gong[id(i,j)][map[i][j]]=1;rcnt[i]++;ccnt[j]++;cnt++;}}}int r,tmpr=-1,c,tmpc=-1;for(i=1;i<=9;i++){if(rcnt[i]>tmpr&&rcnt[i]<9){tmpr=rcnt[i];r=i;}}for(i=1;i<=9;i++){if(ccnt[i]>tmpc&&map[r][i]==0){tmpc=ccnt[i];c=i;}}dfs(r,c,cnt);printf("%d",ans);return 0;
}

 

转载于:https://www.cnblogs.com/WWHHTT/p/9755383.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 1005 - can't create table_关于创建数据表报错一例(ERROR 1005 Can’t create table (errno: 121))...

问题描述曾遇到创建数据表报错问题&#xff0c;报错如下&#xff1a;ERROR 1005 (HY000) at line 18: Cant create table db1.t2 (errno: 121)通过日志查看有一条记录InnoDB: Error: table db1.t2 already exists in InnoDB internal可见要创建的这个表已经存在&#xff0c;导致…

h5输出文字write_免费下载:Write是用于手写的文字处理器

h5输出文字writeWindows/Mac/Linux/Android: Love the feel of writing by hand, but wish you could use features like copy/paste and undo? Write is a free tool that lets you do just that. Windows / Mac / Linux / Android&#xff1a;喜欢手写的感觉&#xff0c;但是…

11. IDEA 在同一工作空间创建多个项目

1.创建项目 二.、创建工作空间 JavaWorkspace 1、File-> New Project -> 创建工作空间 JavaWorkspace&#xff0c;并 顺便创建项目 JavaOne 2.创建第一个项目后形成的目录结构如下 三、在已经创建好的工作空间中创建第二个项目 1、File -> New Module -> 创建项目 …

winform 线程监听两个目录下的文件_vb.net 利用.net自带的GZipStream压缩或者解压文件的代码,不需要任何第三方控件...

网上很少有用VB写的压缩文件的代码&#xff0c;但是&#xff0c;在网络传输&#xff0c;文件下载,打包发布等等方面的需求又比较多&#xff0c;所以&#xff0c;借鉴了一下C#代码的例子&#xff0c;改造成了VB用的类。另外加上了多层文件夹压缩解压。但是&#xff0c;因为时间有…

什么是“ rpcsvchost”,以及为什么它在Mac上运行?

You find something called rpcsvchost while using Activity Monitor to see what’s running on your Mac. What is this process, and should you be worried? In a word, no: rpcsvhost is a core part of macOS. 在使用“活动监视器”查看Mac上正在运行的内容时&#xff…

自定义异常禁用异常堆栈_如何在Mac上禁用或自定义自动更正

自定义异常禁用异常堆栈Sometimes, autocorrect gets it wrong, replacing a word you meant to type with something completely different. You can customize it to fix these issues or disable it altogether. 有时候&#xff0c;自动更正会把它弄错&#xff0c;用完全不同…

控制dcom程序使用端口_使用VS Code调试.net控制台应用程序的方法

本文由 比特飞 原创发布&#xff0c;欢迎大家踊跃转载。转载请注明本文地址&#xff1a;https://www.byteflying.com/archives/6928。1、概述本文向大家介绍使用Visual Studio Code调试.net控制台应用程序的方法。2、方案首先在创建好一个控制台应用程序&#xff0c;再在扩展中…

omnipay支付--支付宝支付

最近负责的项目事关支付宝APP支付 也踩了一些坑 这边记录下 以下代码基于laravel框架下: 生成APP支付参数: $gateway $this->getGateway();$request $gateway->purchase();$request->setBizContent([subject > ,//产品描述out_trade_no > ,//本地订单号…

4khz的带宽是指什么意思_扬声器和耳机的Hz-KHz范围是什么意思?

4khz的带宽是指什么意思If you’ve looked at high-end headphones or speakers, you’ve probably noticed numbers on the spec sheet that read something like “20Hz-20KHz.” What do these numbers mean? 如果您看过高端耳机或扬声器&#xff0c;则可能已经注意到规格表…

mysql两种引擎的适用场景_MySQL两种引擎的区别和应用场景

Innodb引擎Innodb引擎提供了对数据库ACID事务的支持&#xff0c;并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束&#xff0c;它的设计目标是处理大容量数据库系统&#xff0c;它本身其实就是基于MySQL后台的完整数据库系统&#xff0c;MySQL运行时Innodb会在…

linux里查看最耗CPU的线程

1、top后按c查看最耗cpu的进程&#xff0c;得到pid 2、top -Hp pid 查看该进程里的线程资源使用情况&#xff0c;找到最耗资源的线程的pid 3、jstack pid来查看进程的各个线程栈&#xff0c;注意这里的pid是第一步中进程的pid&#xff0c;不是第二步得到的线程id 4、将第二步得…

vlc传输_如何使用VLC通过网络流式传输视频和音乐

vlc传输VLC includes a fairly easy-to-use streaming feature that can stream music and videos over a local network or the Internet. You can tune into the stream using VLC or other media players. VLC包括一个相当易于使用的流媒体功能&#xff0c;可以通过本地网络…

python实现异步的几种方式_终于搞明白了,异步Python比同步Python究竟快在哪里?...

大家好&#xff0c;你是否听人们说过&#xff0c;异步 Python 代码比“普通(或同步)Python 代码更快&#xff1f; 果真是那样吗&#xff1f;同步和异步是什么意思&#xff1f;Web 应用程序通常要处理许多请求&#xff0c;这些请求在短时间内来自不同的客户端。为避免处理延迟&a…

您可能没有注意到的7个Ubuntu File Manager功能

The Nautilus file manager included with Ubuntu includes some useful features you may not notice unless you go looking for them. You can create saved searches, mount remote file systems, use tabs in your file manager, and more. Ubuntu随附的Nautilus文件管理器…

P3174 [HAOI2009]毛毛虫(树形dp)

P3174 [HAOI2009]毛毛虫 题目描述 对于一棵树&#xff0c;我们可以将某条链和与该链相连的边抽出来&#xff0c;看上去就象成一个毛毛虫&#xff0c;点数越多&#xff0c;毛毛虫就越大。例如下图左边的树&#xff08;图 1 &#xff09;抽出一部分就变成了右边的一个毛毛虫了&am…

wdcp mysql密码_WDCP提示无法连接mysql及创建站点提示mysql密码不正确

一、wdcp系统访问提示无法连接mysql1、可能是mysql服务没启动&#xff0c;首先ssh登陆服务器&#xff0c;然后执行service mysqld restart重启mysql再访问试下&#xff0c;如果无法启动&#xff0c;先用df -lh查看下home分区有没有挂载&#xff0c;如果没有挂载尝试先重启&…

applecare多少钱?_否,AppleCare +无法覆盖丢失或被盗的iPhone

applecare多少钱?Losing your iPhone or getting it stolen is pretty common these days, but it’s important to know that while AppleCare covers accidental damage, it doesn’t cover a lost or stolen iPhone. 如今&#xff0c;丢失iPhone或使其被盗很普遍&#xff0…

10以内数的组成分解图_大班数学教案《10以内数的组成》

大班数学教案《10以内数的组成》作为一名教学工作者&#xff0c;时常需要编写教案&#xff0c;借助教案可以让教学工作更科学化。那么什么样的教案才是好的呢&#xff1f;以下是小编收集整理的大班数学教案《10以内数的组成》&#xff0c;希望能够帮助到大家。大班数学教案《10…

HDFS文件目录操作代码

分布式文件系统HDFS中对文件/目录的相关操作代码&#xff0c;整理了一下&#xff0c;大概包括以下部分&#xff1a; 文件夹的新建、删除、重命名文件夹中子文件和目录的统计文件的新建及显示文件内容文件在local和remote间的相互复制定位文件在HDFS中的位置&#xff0c;以及副本…

craigslist_如何设置Craigslist警报(用于电子邮件或SMS)

craigslistWhether you’re looking for apartments or used gadgets on Craigslist, you don’t have to keep checking the website. You can stay on top of things by getting notified when new posts go up that match your searches. 无论您是在Craigslist上寻找公寓还是…