洛谷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 ...
随机推荐
- PL/SQL学习笔记之基本块格式与语法
一:PL/SQL程序块 PL/SQL是一种块结构的语言,一个PL/SQL程序就是一个 代码逻辑块. PL/SQL程序由三部分构成: 1 声明 部分 使用关键字DECLARE开头,它是一个可选的部分,用 ...
- JavaScript深入系列15篇
JavaScirpt深入之从原型到原型链 构造函数创建对象 我们先使用构造函数创建一个对象: function Person() { } var person = new Person(); pers ...
- system函数遇到的问题
这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以 ...
- Ubuntu图形界面环境下启动应该程序:
1.先说下Ubuntu14.04系统开机紫框的问题: Grub theme:黑色屏幕出现紫色边框 There's a minor typo on the grub theme which produc ...
- python调用nmap探测局域网设备
平台:linux 描述:利用os.popen()函数调用系统命令nmap进行扫描,并用grep命令对扫描结果关键内容进行提取 代码 #!/usr/bin/env pthon #--*--coding= ...
- Android Launcher分析和修改10——HotSeat深入进阶
前面已经写过Hotseat分析的文章,主要是讲解如何在Launcher里面配置以及修改Hotseat的参数.今天主要是讲解一下如何在Hotseat里面的Item显示名称.这个小问题昨天折腾了半天,最后 ...
- WebMisCentral-Client 适配MySql数据库
由于本身WebMisCentral采用的是EF5.0,所以适配起来还是非常简单的,下面看操作: 1.ElegantWM.WebUI层中(或者ElegantWM.DAL)通过NUGET下载MySQL.D ...
- git初始化本地项目并推送到git服务器
1.创建本地项目,在项目根目录执行git init命令 git init 2.在git服务器上创建一个仓库,这里使用GitHub创建一个仓库. 3.执行git remote add origin &l ...
- linux 防火墙 ufw使用
ufw是ubuntu是默认的防火墙配置工具,相对于iptables,ufw使用更加简单 ufw基本操作 1 []是代表可选内容,需要root权限 ufw [--dry-run] enable|di ...
- yizhihongqiang
最新网址:https://www. hongxingwangzhi .com/