洛谷P1074 靶形数独【dfs】【剪枝】
题目:https://www.luogu.org/problemnew/show/P1074
题意:
数独的分数如下。一个数独的总分数就是权值乘所填数字之和。
现在给一个未完成的数独,问分数最高的数独的总分。
思路:
感觉dfs就是要学会各种剪枝。要敢于剪枝。
最基本的思路就是记下要填的位置和每行每列每个方块填数的情况,然后每个空格都1~9试过来。填完了计算分数。
但是如果仅仅是这样的话还是不行,只有75分TLE。
我们做数独的时候一般都是找零最少的某行某列或某个方格开始填,因为这样的可能性比较少。
这道题也应该考虑到这样的剪枝,不过只需要考虑行就行了,从空格最少的行开始搜索。
#include<stdio.h>
#include<stdlib.h>
#include<map>
#include<set>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue> #define inf 0x7f7f7f7f
using namespace std;
typedef long long LL;
typedef pair<int, int> pr; int mat[][];
bool visrow[][];
bool viscol[][];
bool vissqu[][]; int ans = -;
vector<pr>zeros;
int n = ; int getscore()
{
int tmp = ;
for(int i = ; i < ; i++){
for(int j = ; j < ; j++){
tmp += mat[i][j] * ;
}
}
for(int k = ; k < ; k++){
for(int i = + k; i < - k; i++){
for(int j = + k; j < - k; j++){
tmp += mat[i][j];
}
}
} return tmp;
} void dfs(int id)
{
if(id == n){
// for(int i = 0; i < 9; i++){
// for(int j = 0; j < 9; j++){
// printf("%d ", mat[i][j]);
// }
// printf("\n");
// }
// printf("%d\n\n", getscore()); ans = max(ans, getscore());
}
int i = zeros[id].first;
int j = zeros[id].second;
for(int k = ; k <= ; k++){
if(!visrow[i][k] && !viscol[j][k] && !vissqu[i / * + j / ][k]){
mat[i][j] = k;
visrow[i][k] = viscol[j][k] = vissqu[i / * + j / ][k] = true;
dfs(id + );
visrow[i][k] = viscol[j][k] = vissqu[i / * + j / ][k] = false;
mat[i][j] = ;
}
}
return;
} vector<int>zero[];
struct node{
int row, cnt;
}rows[]; bool cmp(node a, node b)
{
return a.cnt < b.cnt;
} int main()
{
for(int i = ; i < ; i++){
rows[i].row = i;
for(int j = ; j < ; j++){
scanf("%d", &mat[i][j]);
if(mat[i][j]){
visrow[i][mat[i][j]] = true;
viscol[j][mat[i][j]] = true;
vissqu[i / * + j / ][mat[i][j]] = true;
}
else{
rows[i].cnt++;
zero[i].push_back(j);
n++;
}
}
}
sort(rows, rows + , cmp);
for(int i = ; i < ; i++){
int r = rows[i].row;
for(int j = ; j < rows[i].cnt; j++){
zeros.push_back(make_pair(r, zero[r][j]));
}
} dfs();
printf("%d\n", ans); return ;
}
洛谷P1074 靶形数独【dfs】【剪枝】的更多相关文章
- 洛谷——P1074 靶形数独
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z ...
- 洛谷 P1074 靶形数独(剪枝)
//人生中第一道蓝题(3.5h) 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请 ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- [洛谷P1074] 靶形数独
洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...
- [NOIP2009] 提高组 洛谷P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- 洛谷 P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- 洛谷—— P1074 靶形数独
https://www.luogu.org/problem/show?pid=1074 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但 ...
- 洛谷 P1074 靶形数独 Label:search 不会
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- 洛谷P1074 靶形数独(算竞进阶习题)
还是数独.. 比上一个多了个分数矩阵,其实没什么差别,但是数据好像水了许多... #include <bits/stdc++.h> #define INF 0x3f3f3f3f using ...
随机推荐
- 每天一个linux命令(2):cd命令
1.作用 cd(Change Directory 改变目录)命令用来切换工作目录至dirname. 其中dirName表示法可为绝对路径或相对路径.若目录名称省略,则变换至使用者的home direc ...
- 【PMP】项目的定义和特点
1.定义 项目是为创建独特的产品.服务和成果而进行的的临时性工作. 2.特点 2.1 独特的产品.服务或成果 实现项目目标可能产生一个或多个可交付成果.例如:即便采用相同的材料或者相同的施工单位来建设 ...
- 转 sshfs把远程主机的文件系统映射到本地的目录中
windows之外的世界比想像中要大得多呢,几乎天天都在用ssh,却到今天才知道有sshfs这个好东西,前几天还在为ZendStudio可以远程编辑文件欣喜,惭愧啊,终于有比vi scp://host ...
- swift3 单例写法
import UIKit class SingleOnce { // 单例 static let shared = SingleOnce.init() private init(){} // 其他方法 ...
- 基于Centos体验自然语言处理 by PHP SDK
系统要求:CentOS 7.2 64 位操作系统 准备工作 获取 SecretId 和 SecretKey1 前往 密钥管理 页面获取你的 SecretId 和 SecretKey 信息,这些信息将会 ...
- 使用Python解析JSON详解
为大家介绍如何使用 Python 语言来编码和解码 JSON 对象. JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写. JSON 函数 ...
- 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-6底层驱动之多路开关选择器
视频简介:该视频介绍iCore3应用开发平台中多路开关选择器的应用,多路开关选择器的硬件电路连接以及软件实现的方法. 源视频包下载地址:链接:http://pan.baidu.com/s/1geQ4W ...
- ORACLE 11.2.0.4 OCR VOTING DISK 模拟恢复场景
① 备份 ocrconfig -export 文件名 或者 ocrconfig -manualbackup 或者 找到备份 ocrconfig -local -showb ...
- java主线程等待所有子线程执行完毕在执行(常见面试题)
java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个 ...
- Ubuntu14.04下安装MATLAB后,通过命令行打开其图形界面
安装的是Matlab R2017a,使用的是默认安装目录,安装在目录/usr/local/MATLAB/R2017a/bin中.那么安装完成之后系统不会给Matlab添加系统路径,只有把终端切换到安装 ...