洛谷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 ...
随机推荐
- javascript arguments介绍
来源于: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments https://g ...
- Buffering of C streams
This chapter describes buffering modes used by z/OS XL C/C++ library functions available to control ...
- JAVA中对List<Map<String,Object>>中的中文汉字进行排序
转载于:http://blog.csdn.net/flykos/article/details/54631573 参考:http://www.jb51.net/article/88710.htm 本篇 ...
- MySQL 聚簇索引&&二级索引&&辅助索引
MySQL非聚簇索引&&二级索引&&辅助索引 mysql中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅 ...
- DropDMG for Mac(dmg 文件打包工具)破解版安装
1.软件简介 DropDMG 是 macOS 系统上的一款帮助用户快速打包 DMG 文件的 Mac 文件管理软件,DropDMG 不但可以将影像档加密.更可以配合 GZip .BZip2 .Ma ...
- 第三部分:Android 应用程序接口指南---第一节:应用程序组件---第一章1-1.Fragment
第1-1章 Fragments 在Activity中的fragment代表的是一种行为或用户界面的一部分.你可以在activity中结合多个fragments创建一个多面板UI,并可以在多个activ ...
- 译: 5. RabbitMQ Spring AMQP 之 Topic 主题
在上一个教程中,我们提高了消息传递的灵活 我们使用direct交换而不是使用仅能够进行虚拟广播的fanout交换, 并且获得了基于路由key 有选择地接收消息的可能性. 虽然使用direct 交换改进 ...
- Atitit.每周计划日程表 流程表v3
Atitit.每周计划日程表 流程表 每周趋势总结 新特性聚合 最佳实践聚合. 上周总结 本度计划 检查于推进年度计划月度计划里程碑 检查于推进季度计划月度计划里程碑 上周Todo汇总结转.. 待报 ...
- 基于Openresty+的WEB安全防护系统架构--转
随着时间的推移,我们在实践中也不断的演进我们的服务部署方案,希望WEB防护,不只是单独的云WAF来保护服务,而有其它的相关服务,对WAF进行增强加固的合理配合.我们使用Openresty+系统构建了W ...
- CodeCombat编程游戏
一. 介绍 官方网站:http://cn.codecombat.com/ 项目地址:https://github.com/codecombat/codecombat CodeCombat 是一个通过玩 ...