CODEVS 1174 靶形数独
来源:互联网 发布:淘宝在哪里搜店铺? 编辑:程序博客网 时间:2024/04/30 04:07
题目描述 Description
小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他
们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,
Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。
靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有9 个3 格宽×3 格
高的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是已知的,根据这些
数字,利用逻辑推理,在其他的空格上填入1 到9 的数字。每个数字在每个小九宫格内不能
重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即
每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。
上图具体的分值分布是:最里面一格(黄色区域)为 10 分,黄色区域外面的一圈(红
色区域)每个格子为9 分,再外面一圈(蓝色区域)每个格子为8 分,蓝色区域外面一圈(棕
色区域)每个格子为7 分,最外面一圈(白色区域)每个格子为6 分,如上图所示。比赛的
要求是:每个人必须完成一个给定的数独(每个给定数独可能有不同的填法),而且要争取
更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字
的乘积的总和。如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为2829。游
戏规定,将以总分数的高低决出胜负。
由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能
够得到的最高分数。
输入描述 Input Description
一共 9 行。每行9 个整数(每个数都在0—9 的范围内),表示一个尚未填满的数独方
格,未填的空格用“0”表示。每两个数字之间用一个空格隔开。
输出描述 Output Description
输出可以得到的靶形数独的最高分数。如果这个数独无解,则输出整数-1。
样例输入 Sample Input
【输入输出样例 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
样例输出 Sample Output
【输入输出样例 1】
2829
【输入输出样例 1】
2852
数据范围及提示 Data Size & Hint
【数据范围】
40%的数据,数独中非0 数的个数不少于30。
80%的数据,数独中非0 数的个数不少于26。
100%的数据,数独中非0 数的个数不少于24。
分析
倒过来搜索(把输入倒过来…)快多了直接AC
代码
#include <bits/stdc++.h>#define searchnext(x,y) y==9? search(x+1,1):search(x,y+1)#define N 20using namespace std;bool r[N][N],l[N][N],s[N][N];int a[N][N],b[N][N];int ans = -1,score;int getscore(int x,int y,int k){ if (x == 5 && y == 5) return 10 * k; else if (x >= 4 && x <= 6 && y >= 4 && y <= 6) return 9 * k; else if (x >= 3 && x <= 7 && y >= 3 && y <= 7) return 8 * k; else if ( x>= 2 && x <= 8 && y >= 2 && y <= 8) return 7 * k; else return 6 * k;}bool fillin(int x,int y,int k){ if (r[x][k]) return 0; if (l[y][k]) return 0; if (s[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][k]) return 0; b[x][y] = k; r[x][k] = l[y][k] = s[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][k] = 1; score += getscore(x,y,k); return 1;}void del(int x,int y,int k){ b[x][y] = 0; r[x][k] = l[y][k] = s[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][k] = 0;}void search(int x,int y){ if(x == 10 & y == 1) { ans = max(ans,score); return; } if (b[x][y]) searchnext(x,y); else for(int i = 1; i <= 9; i++) { int t = score; if(fillin(x,y,i)) { searchnext(x,y); del(x,y,i); score = t; } }}int main(){ for (int i = 9; i > 0; i--) for (int j = 9;j > 0; j--) { scanf("%d",&a[i][j]); if(a[i][j])fillin(i,j,a[i][j]); } search(1,1); printf("%d",ans); return 0;}
- CODEVS 1174 靶形数独
- codevs 1174 靶形数独
- 靶形数独 (codevs 1174)题解
- codevs 1174 靶形数独 (启发式搜索)
- 【wikioi】1174靶形数独
- codevs 1174 靶形数独 2009年NOIP全国联赛提高组
- Wiki OI 1174 靶形数独
- 【搜索】靶形数独
- 测试靶形数独
- 靶形数独
- 靶形数独
- 靶形数独
- NOIP2009 靶形数独
- NOIP2009 靶形数独
- [codevs1174] 靶形数独
- [vijos1755]靶形数独
- 靶形数独
- NOIP2009 靶形数独
- maven项目转web项目的一点小问题
- Bootstrap Scrollspy Plugin
- Django入门探索(一)
- RS232,RS485波形分析
- table中如何消除td间距
- CODEVS 1174 靶形数独
- 【Goodbye2014】Codeforces 500C New Year Book Reading【贪心+模拟】
- 腾讯云Badjs镜像使用入门
- 运算符重载-流插入运算符和流提取运算符的重载
- 在eclipse里的tomcat发布项目提示404错误,可能的情况
- 2017.2.25 B组 倒霉的小C 题解及其证明
- USART输出乱码3F,RS485抄表
- MPAndroidChart图形框架(详细使用基本API)
- 嵌入式软件设计(1)--概述