题目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】【剪枝】的更多相关文章

  1. 洛谷——P1074 靶形数独

    P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z ...

  2. 洛谷 P1074 靶形数独(剪枝)

    //人生中第一道蓝题(3.5h) 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请 ...

  3. 洛谷P1074 靶形数独 [搜索]

    题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...

  4. [洛谷P1074] 靶形数独

    洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...

  5. [NOIP2009] 提高组 洛谷P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  6. 洛谷 P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  7. 洛谷—— P1074 靶形数独

    https://www.luogu.org/problem/show?pid=1074 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但 ...

  8. 洛谷 P1074 靶形数独 Label:search 不会

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  9. 洛谷P1074 靶形数独(算竞进阶习题)

    还是数独.. 比上一个多了个分数矩阵,其实没什么差别,但是数据好像水了许多... #include <bits/stdc++.h> #define INF 0x3f3f3f3f using ...

随机推荐

  1. PL/SQL学习笔记之基本块格式与语法

    一:PL/SQL程序块 PL/SQL是一种块结构的语言,一个PL/SQL程序就是一个 代码逻辑块. PL/SQL程序由三部分构成: 1 声明 部分 使用关键字DECLARE开头,它是一个可选的部分,用 ...

  2. JavaScript深入系列15篇

    JavaScirpt深入之从原型到原型链 构造函数创建对象 我们先使用构造函数创建一个对象: function Person() { } var person = new Person(); pers ...

  3. system函数遇到的问题

     这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以 ...

  4. Ubuntu图形界面环境下启动应该程序:

    1.先说下Ubuntu14.04系统开机紫框的问题: Grub theme:黑色屏幕出现紫色边框 There's a minor typo on the grub theme which produc ...

  5. python调用nmap探测局域网设备

    平台:linux 描述:利用os.popen()函数调用系统命令nmap进行扫描,并用grep命令对扫描结果关键内容进行提取 代码 #!/usr/bin/env pthon #--*--coding= ...

  6. Android Launcher分析和修改10——HotSeat深入进阶

    前面已经写过Hotseat分析的文章,主要是讲解如何在Launcher里面配置以及修改Hotseat的参数.今天主要是讲解一下如何在Hotseat里面的Item显示名称.这个小问题昨天折腾了半天,最后 ...

  7. WebMisCentral-Client 适配MySql数据库

    由于本身WebMisCentral采用的是EF5.0,所以适配起来还是非常简单的,下面看操作: 1.ElegantWM.WebUI层中(或者ElegantWM.DAL)通过NUGET下载MySQL.D ...

  8. git初始化本地项目并推送到git服务器

    1.创建本地项目,在项目根目录执行git init命令 git init 2.在git服务器上创建一个仓库,这里使用GitHub创建一个仓库. 3.执行git remote add origin &l ...

  9. linux 防火墙 ufw使用

    ufw是ubuntu是默认的防火墙配置工具,相对于iptables,ufw使用更加简单 ufw基本操作   1 []是代表可选内容,需要root权限 ufw [--dry-run] enable|di ...

  10. yizhihongqiang

    最新网址:https://www.     hongxingwangzhi           .com/