洛谷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. Java 基础(8)——流程控制

    上次的运算符都消化好了吗?每一天都要用到一些哦~ 以前有提到过一嘴,程序执行都是从上到下执行的,emm,学到这里,感觉这句话是对的也是错的了…… 如果都是一行一行执行下去的话,上节课的例子: 今天不上 ...

  2. Uva 1378 - A Funny Stone Game

    1378 - A Funny Stone Game Time limit: 3.000 seconds The funny stone game is coming. There are n pile ...

  3. 我的Java编码规范

    1.类名采用驼峰命名法,首字母大写. 2.类变量采用驼峰命名法,首字母小写. 3.方法名是一个动词短语,首字母小写,尽量能描述清楚这个方法的意图. 4.注释在精不在多,一个好的注释要尽量描述出这段代码 ...

  4. 给div加上padding和border,如何不让div整体改变

    最近要入门H5,遇到很多困惑,所以,每解决一个,我就要写在博客里,以防忘记! 给div加上padding和border,如何不让div整体改变? 如果想要实现这样的效果,只需要在这个div块中写入 b ...

  5. js原生获取css属性

    原文参考http://blog.csdn.net/lzding/article/details/46317777 1.写在dom上的属性,内联样式 <div id="box" ...

  6. Perl学习笔记(2)----正则表达式数字匹配的一个疏忽

    <Perl语言入门>第15章习题第2题如下: 用 given-when 结构写一个程序,根据输入的数字,如果它能被3整除,就打印“Fizz”:如果它能被5整除,就打印“Bin”:如果它能被 ...

  7. hdu 1087 Super Jumping! Jumping! Jumping!(最大上升子序列和)

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  8. linux 系统开机自启执行 操作的配置

    1 linux 服务注册 service文件 在service文件中设置变量和环境变量 [Unit] Description= #服务描述 After=syslog.target #服务启动依赖 [S ...

  9. 关于pom版本提交不成功的问题

    今天碰到个问题:我在原来的一个pom项目的client服务里面修改了一个java类,但是没有升级版本.然后再预发环境更新后,从显示的日志来看,仍然是我修改前的版本. 这就奇怪了,看了svn确实已经提交 ...

  10. Kibana基本使用

    现在你已经安装了Kibana,现在你一步步通过本教程快速获取Kibana核心功能的实践经验.学习完本教程,你将: 1.加载案例数据到你安装的Elasticsearch中 2. 定义至少一个索引匹配模式 ...