洛谷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+剪枝)的更多相关文章

  1. 【NOIP2009】【CJOJ1687】【洛谷1074】靶形数独

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

  2. 洛谷1074 靶状数独dfs 排序、记录、搜索

    题目网址:https://www.luogu.com.cn/problem/P1074 大意就是在一个9*9的数独中填数,要求行列宫都是九个互不相同的数字,给定一定的得分机制,要求求解最大得分.思路大 ...

  3. 伪题解 洛谷 P1363 幻想迷宫(DFS)

    毒瘤题,做了一晚上抄题解A了 因为是抄题解,我也不好意思说什么了,就发篇博客纪念一下吧 #include<iostream> #include<cstring> #includ ...

  4. [洛谷P1074] 靶形数独

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

  5. 洛谷P1074 靶形数独【dfs】【剪枝】

    题目:https://www.luogu.org/problemnew/show/P1074 题意: 数独的分数如下.一个数独的总分数就是权值乘所填数字之和. 现在给一个未完成的数独,问分数最高的数独 ...

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

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

  7. 洛谷——P1074 靶形数独

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

  8. 洛谷 P1074 靶形数独

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

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

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

随机推荐

  1. docker容器启动时执行脚本 run /bin/bash执行多条指令

    搜了很多资料发现并未解决,以下方法失败!求大神评论给出完美方案 1.首先需要编写需要启动的脚本,并将脚本放在 /etc/init.d/目录下 如:cs.sh 2.修改权限 3.chkconfig -- ...

  2. thinkphp传送文章id值

  3. 第4章 css文字text与字体font-face

    text-overflow 与 word-wrap text-overflow:用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出 ...

  4. log在无法调试代码时的妙用

    1. 如果修改源代码 通过加入log打印日志 可以判断程序走的流程 找到需要自定义修改的位置(如修改java编写的项目 ApacheDS ) 2. 如果java调用dll文件 出错了 排错的方式也可以 ...

  5. timestamp to time 时间戳转日期

    function timestampToTime(timestamp) { var date = new Date(timestamp * 1000);   //timestamp 为10位需*100 ...

  6. HTML 简单日历制作方法

    新手一枚,不会写什么高大上的博文,一些平时做的小练习,献丑 <!doctype html> <html> <head> <meta charset=" ...

  7. 关于webuploader 在ie9上不能触发 input 的 change 事件

    上传文件用了 webuploader,ie9以上及其它浏览器正常执行js ,但是在ie9上点击input 无效,不能触发change 事件. 第一反应是ie9 需要使用flash 上传文件 原因: . ...

  8. 浅谈回归(二)——Regression 之历史错误翻译

    我很好奇这个问题,于是搜了一下.我发现 Regression 这个词 本意里有"衰退"的意思. 词根词缀: re- 回 , 向后 + -gress- 步 , 级 + -ion 名词 ...

  9. 【Web】JavaScript 语法入门

    一. 简介 动态性和交互性 1.由浏览器解释执行 2.常见的脚本语言:JavaScript和VBScript P.S. Node.js 是使用JavaScript编写的服务器端框架. 二. JavaS ...

  10. Retrofit 抽象工厂模式

    https://blog.csdn.net/h176nhx7/article/details/78139371