洛谷1074 靶状数独dfs 排序、记录、搜索
题目网址:https://www.luogu.com.cn/problem/P1074
大意就是在一个9*9的数独中填数,要求行列宫都是九个互不相同的数字,给定一定的得分机制,要求求解最大得分。思路大致从零最少的行开始搜索(试想现实中你做数独一定是这样的方法),然后只要将0位置的信息保存,总数就是深度值。按照优先搜索的顺序逐个填写,为了节省计算资源,在搜索之前就预处理0位置的相关信息。
#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define mem(a) memset(a,0,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define scand(x) scanf("%llf",&x)
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define pb(i) push_back(i)
#define ppb(x) pop_back(x)
#define scan(a) scanf("%d",&a)
#define pf printf
#define f(i,a,b) for(int i=a;i<=b;i++)
int n,init,tot,ans=-,a[][],hang[][],lie[][],gong[][],s[][];
//s[][0]保存行,s[][1]保存列,s[][2]保存宫,s[][3] 保存得分
struct node{
int hang,zero_cnt;
}p[];
bool cmp(node& a, node& b)
{
return a.zero_cnt<b.zero_cnt;
} int score(int x,int y)
{
if(x==&&y==)return ;
else if(x>=&&x<=&&y>=&&y<=)return ;
else if(x>=&&x<=&&y>=&&y<=)return ;
else if(x>=&&x<=&&y>=&&y<=)return ;
else return ;
}
int which(int x,int y)
{
if(x>=&&x<=&&y>=&&y<=)return ;
else if(x>=&&x<=&&y>=&&y<=)return ;
else if(x>=&&x<=&&y>=&&y<=)return ;
else if(x>=&&x<=&&y>=&&y<=)return ;
else if(x>=&&x<=&&y>=&&y<=)return ;
else if(x>=&&x<=&&y>=&&y<=)return ;
else if(x>=&&x<=&&y>=&&y<=)return ;
else if(x>=&&x<=&&y>=&&y<=)return ;
else if(x>=&&x<=&&y>=&&y<=)return ;
}
void dfs(int dep ,int sum)//搜索深度以及得分总数
{
if(dep==tot)
{
// dbg(sum);
if(sum>ans)ans=sum;
return ;
}
f(i,,)//在dep深度的位置填1-9的数字
{
//行列宫都不冲突
if(!hang[s[dep][]][i]&&!lie[s[dep][]][i]&&!gong[s[dep][]][i])
{
hang[s[dep][]][i]=lie[s[dep][]][i]=gong[s[dep][]][i]=;
dfs(dep+,sum+i*s[dep][]);
hang[s[dep][]][i]=lie[s[dep][]][i]=gong[s[dep][]][i]=;
}
}
return;
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
f(i,,)
{
p[i].hang=i;
f(j,,)
{
scan(a[i][j]);
if(a[i][j])
{
init+=a[i][j]*score(i,j);
hang[i][a[i][j]]=;
lie[j][a[i][j]]=;
gong[which(i,j)][a[i][j]]=;
}
else
{
p[i].zero_cnt++;
}
}
} sort(p+,p+,cmp); f(i,,)
{
f(j,,)
{
if(a[p[i].hang][j]==)
{
s[tot][]=p[i].hang;//保存每个零位置的行、列、宫以及得分,否则dfs中将会重复计算
s[tot][]=j;
s[tot][]=which(p[i].hang,j);
s[tot++][]=score(p[i].hang,j);
}
}
}
// dbg(init);
//dbg(tot);
dfs(,init);//从第0个零的位置开始搜索,初始得分为init
pf("%d",ans);
return ;
}
洛谷1074 靶状数独dfs 排序、记录、搜索的更多相关文章
- 洛谷1378 油滴扩展 dfs进行回溯搜索
题目链接:https://www.luogu.com.cn/problem/P1378 题目中给出矩形的长宽和一些点,可以在每个点放油滴,油滴会扩展,直到触碰到矩形的周边或者其他油滴的边缘,求出剩余面 ...
- 【NOIP2009】【CJOJ1687】【洛谷1074】靶形数独
题面 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出 ...
- [洛谷P3809]【模板】后缀排序
[洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...
- 【洛谷4005】小Y和地铁(搜索)
[洛谷4005]小Y和地铁(搜索) 题面 洛谷 有点长. 题解 首先对于需要被链接的两个点,样例中间基本上把所有的情况都给出来了. 但是还缺了一种从下面绕道左边在从整个上面跨过去在从右边绕到下面来的情 ...
- 【题解】洛谷P1074 [NOIP2009TG] 靶形数独(DFS+剪枝)
洛谷P1074:https://www.luogu.org/problemnew/show/P1074 思路 这道题一看就是DFS 打一个分数表方便后面算分 我用x y z数组分别表示行 列 宫 是否 ...
- 洛谷P1219 八皇后【dfs】
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)
科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...
- 【题解】洛谷P3953 [NOIP2017TG] 逛公园(记忆化搜索+SPFA)
题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA 因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 ...
- 如何求先序排列和后序排列——hihocoder1049+洛谷1030+HDU1710+POJ2255+UVA548【二叉树递归搜索】
[已知先序.中序求后序排列]--字符串类型 #1049 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho在这一周遇到的问题便是:给出一棵二叉树的前序和 ...
随机推荐
- 算法基本概念及常用算法Python实现
基础算法概念: 时间复杂度 时间复杂度是从其增速的角度度量的, 时间复杂度一般用大O法表示. 递归 递归指的是调用自己的函数. 如果使用循环,程序性能可能更高: 如果使用递归,程序可能更容易理解. ...
- AI超越人类大脑,或许是场“别有用心者”的骗局
谷歌.微软.苹果.特斯拉.百度.腾讯.阿里等互联网巨头企业,以及纳德拉.马斯克.扎克伯格.马云等互联网大佬,近年来一直都对人工智能--AI非常上心.在众多场合对AI给予了或肯定,或恐惧的评价.但无 ...
- yii批量数据插入
yii框架批量插入数据有两种方法,第一种是循环多次插入和一次批量插入,第一种方法要注意插入数据中间有一次数据插入失败要注意回滚事务 循环插入数据 第一种方法 $model = new User(); ...
- 给文本中的url加超级链接,同时滤过已加过链接的url
/** * 给文本中的url加超级链接,同时滤过已有链接的url * @param string $str [description] * @return [type] [description] * ...
- ConcurrentHashMap源码探究 (JDK 1.8)
很早就知道在多线程环境中,HashMap不安全,应该使用ConcurrentHashMap等并发安全的容器代替,对于ConcurrentHashMap也有一定的了解,但是由于没有深入到源码层面,很多理 ...
- 拿到webshell之后的事情
之前搞站都是搞到后台管理员,或者搞到webshell就宣布结束了,,今天终于有机会学习一下后面的操作了. 公司网站为php的站,已经拿到webshell.可以进行菜刀连接. 菜刀虚拟终端 php -m ...
- 基于activity的强大java工作流引擎,可视化开发工作流
我们先来看看工作流引擎和Activity? 工作流引擎 所谓工作流引擎是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色.分工和条件的不同决定信息传递路由.内容等级等 ...
- 从0开发3D引擎(十):使用领域驱动设计,从最小3D程序中提炼引擎(上)
目录 上一篇博文 下一篇博文 前置知识 回顾上文 最小3D程序完整代码地址 通用语言 将会在本文解决的不足之处 本文流程 解释本文使用的领域驱动设计的一些概念 本文的领域驱动设计选型 设计 引擎名 识 ...
- Newman+Jenkins实现接口自动化测试
目录 一.是什么Newman 二.如何安装 三.如何使用 1.运行本地文件 2.运行在线文件 3.以node.js库运行 4.导出报告 四.命令行测试真实接口 1.导出collection文件 2.导 ...
- centos 7上openJdk 安装
为什么不安装Oracle版本 oracle jdk 现在下载太恶心了会被登陆拦截.于是就安装openjdk. 步骤 下载 yum -y install java-1.8.0-openjdk java- ...