【题解】洛谷P1074 [NOIP2009TG] 靶形数独(DFS+剪枝)
洛谷P1074:https://www.luogu.org/problemnew/show/P1074
思路
这道题一看就是DFS
打一个分数表方便后面算分
我用x y z数组分别表示行 列 宫 是否有放置数字
用cnt结构体中no和zero分别表示每行行号和每行的零的数量(下面会讲到为什么)
我们把每行按照零的数量从小到大排序 并保留行号来计算(因为搜索的层数与每行0的个数有关)
我们用一个队列q表示有几个点要枚举
然后我们从零最少的那行开始枚举就ok了
PS:ans一开始要赋值为-1 因为有无解的情况要输出-1(没有判无解的话95分 别问我咋知道的)
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int score[][]=
{{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,}};
int ans=-,k,maxn;
int map[][],q[][];
bool x[][],y[][],z[][];
struct date
{
int no;
int zero;
}cnt[];
bool cmp(date a,date b)
{
return a.zero<b.zero;
}
int g(int ii,int jj)//判断宫
{
if(ii<=)
{
if(jj<=) return ;
else if(jj<=) return ;
else return ;
}
else if(ii<=)
{
if(jj<=) return ;
else if(jj<=) return ;
else return ;
}
else
{
if(jj<=) return ;
else if(jj<=) return ;
else return ;
}
}
void cinn()
{
for(int i=;i<=;i++)
{
cnt[i].no=i;//记录行号
for(int j=;j<=;j++)
{
cin>>map[i][j];
if(map[i][j]!=)
{
maxn+=map[i][j]*score[i][j];//预算本来就有的分数
x[i][map[i][j]]=;
y[j][map[i][j]]=;
z[g(i,j)][map[i][j]]=;//把行列宫记录
}
else
cnt[i].zero++;//计算0的个数
}
}
}
void dfs(int now,int sum)//now为队列中第几个点 sum为总分
{
if(now>k)//如果队列中的每个点都被枚举过了
{
ans=max(sum,ans);//找出最大值
return;
}
for(int i=;i<=;i++)//枚举数字
if(!x[q[now][]][i]&&!y[q[now][]][i]&&!z[q[now][]][i])//如果行列宫均没有用过这个数字
{
x[q[now][]][i]=y[q[now][]][i]=z[q[now][]][i]=;//行列宫记录
map[q[now][]][q[now][]]=i;//记录这个数字
dfs(now+,sum+score[q[now][]][q[now][]]*map[q[now][]][q[now][]]);
x[q[now][]][i]=y[q[now][]][i]=z[q[now][]][i]=;//还原操作
map[q[now][]][q[now][]]=;
}
}
int main()
{
cinn();
sort(+cnt,++cnt,cmp);//排序
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
if(!map[cnt[i].no][j])
{
q[++k][]=cnt[i].no;
q[k][]=j;
q[k][]=g(cnt[i].no,j);
}
}
dfs(,maxn);
cout<<ans;
}
【题解】洛谷P1074 [NOIP2009TG] 靶形数独(DFS+剪枝)的更多相关文章
- 【NOIP2009】【CJOJ1687】【洛谷1074】靶形数独
题面 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出 ...
- 洛谷1074 靶状数独dfs 排序、记录、搜索
题目网址:https://www.luogu.com.cn/problem/P1074 大意就是在一个9*9的数独中填数,要求行列宫都是九个互不相同的数字,给定一定的得分机制,要求求解最大得分.思路大 ...
- 伪题解 洛谷 P1363 幻想迷宫(DFS)
毒瘤题,做了一晚上抄题解A了 因为是抄题解,我也不好意思说什么了,就发篇博客纪念一下吧 #include<iostream> #include<cstring> #includ ...
- [洛谷P1074] 靶形数独
洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...
- 洛谷P1074 靶形数独【dfs】【剪枝】
题目:https://www.luogu.org/problemnew/show/P1074 题意: 数独的分数如下.一个数独的总分数就是权值乘所填数字之和. 现在给一个未完成的数独,问分数最高的数独 ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- 洛谷——P1074 靶形数独
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z ...
- 洛谷 P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- [NOIP2009] 提高组 洛谷P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
随机推荐
- JavaEE之servlet相关技术
相关技术:为了灵活实现的不同路径(/hello)执行不同的资源( HeIIoMyServlet)我们需要使用XML进行配置;为了限定XML内容,我们需要使用xml约束(DTD或schema);为了获得 ...
- mysql索引是什么?索引结构和使用详解
索引是什么 mysql索引: 是一种帮助mysql高效的获取数据的数据结构,这些数据结构以某种方式引用数据,这种结构就是索引.可简单理解为排好序的快速查找数据结构.如果要查“mysql”这个单词,我们 ...
- html 之 position用法
引用: position的四个属性值: 1.relative2.absolute3.fixed4.static下面分别讲述这四个属性. <div id="parent"> ...
- ueditor默认字体和字号修改
ueditor编辑器默认字号是16号,默认字体为sans-serif,显得有些难看,所以决定修改默认值.配置文件ueditor.config.js可以修改整个编辑器配置项,里面有配置项fontfami ...
- ERP与电子商务的集成
目前现状: 一般来说,企业中存在三种流:物资流.资金流和信息流,其中,信息流不是孤立存在的,它与物资流和资金流密切相关,反映了物资和资金流动前.流动中和流动后的状况. 电子商务与ERP被分裂开来,没有 ...
- 【Python】Python3基本语法入门学习
0.Python概述 1.First Word Game 2.变量与字符串 3.improved game 4.Python数据类型 5.常用操作符 6.分支与循环 7.列表 8.元组 9.字符串内置 ...
- 一、CSS实现横列布局的方法总结
一.使用float实现横列布局的方法 如下面所示:DIV1和DIV2都可以选择向左或者向右浮动50%来实现展示在同一行 div1 div2 实现下面图片中布局的css样式如下: 分析: 1.第一行第一 ...
- 关于比特币的“冷存储”和Armory的使用
转自:http://8btc.com/thread-1164-1-1.html 最近随着比特币话题的火热,又有一批人卖房或倾产换成比特币入圈,这一次与以前不同的是,以前倾产入圈的人都是技术人员,有足够 ...
- java面试题之----IO与NIO的区别
JAVA NIO vs IO 当我们学习了Java NIO和IO后,我们很快就会思考一个问题: 什么时候应该使用IO,什么时候我应该使用NIO 在下文中我会尝试用例子阐述java NIO 和IO的区别 ...
- Linux 虚拟机的计划维护
Azure 定期执行更新,以提高虚拟机的主机基础结构的可靠性.性能及安全性. 此类更新包括修补宿主环境(例如操作系统.虚拟机监控程序以及主机上部署的各种代理)中的软件组件.升级网络组件以及硬件解除授权 ...