题意:

题目传送门

可以看做一个人手中有一些宝石,并将宝石分成两组,一组的编号为 1 至 n×m/2,二组为 n×m/2+1 至 n×m+1。当两组两个宝石编号相差为 n×m/2 为一对。现在要遍历一个 n×m 的方阵,只能走上下左右,且每个格子必须且仅能到过 1 次。并在遍历同时对每一个格子放入宝石。即遍历的第 i 个格子放入编号为 i 的宝石。

对于一对宝石,如果第一组的宝石在第 x1 行第 y1 列,第二组宝石的在第 x2 行第 y2 列,则称它们的分值为 k1×abs(x1-x2)+k2×abs(y1-y2)。

现在要找出一种遍历顺序,使分值最大一对宝石分值最小,输出这个最小的最大分值。

思路:

看到是遍历,且数据范围非常小,考虑用 dfs。不过如果不加剪枝优化的爆搜,肯定会 TLE 飞,因此考虑剪枝。

首先是一个很好想的最优化剪枝:如果当前记录的最大值已经比之前的方案大了,那就不可能更新答案,没必要搜索,直接

返回。

但只有这一个剪枝还不行,我们发现题目中一个很重要的事:每个格子必须且仅能到过 1 次。因此当发现已经不可能满足要求的时候,便可以直接返回。

那如何判断呢?

当一个现在这个点的上下走过且左右没走,或者左右走过上下没走,则不能满足要求。

因为当上下走过时,他们所联通的路线一定将左右分别能到达的点分隔成两个连通块,左右走过上下没走也是同理。

画个图方便理解一下:

有了这些就可以愉快的写代码了。

代码:

请勿抄袭。

#include<bits/stdc++.h>
using namespace std;
int n,m,k1,k2;
//与题目中意义一致
int ans=1e10;//记录答案
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1}; //移动的方向数组
bool f[61][61];//记录是否被走过
int q[2500][2];//记录第一组宝石所在的点
inline void dfs(int x,int y,int p,int mmax)
//x,y:当前点的坐标,p:搜到的宝石编号,mmax:目前的最大的分数
{
if(mmax>=ans) return;//最优性剪枝
if(f[x+1][y]&&f[x-1][y]&&!f[x][y+1]&&!f[x][y-1]) return;
if(f[x][y+1]&&f[x][y-1]&&!f[x+1][y]&&!f[x-1][y]) return;
//两种不可能完成遍历的情况
if(p<=n*m/2) q[p][0]=x,q[p][1]=y;//第一组,直接存储
else//第二组,开始计算
{
mmax=max(mmax,(k1*abs(x-q[p-(n*m/2)][0])+k2*abs(y-q[p-(n*m/2)][1])));//根据公式求值
}
if(p==n*m)//搜索完了
{
if(mmax<ans) ans=mmax;//能更新答案则更新
return;
}
for(int i=0;i<4;i++)//继续向能走到的点搜索
{
int xx=x+dx[i];
int yy=y+dy[i];
if(!f[xx][yy])//没走过,可以走
{
f[xx][yy]=1;//标记
dfs(xx,yy,p+1,mmax);
f[xx][yy]=0;//回溯
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&k1,&k2);
for(int i=0;i<=n+1;i++) f[i][0]=1,f[i][m+1]=1;
for(int i=0;i<=m+1;i++) f[0][i]=1,f[n+1][i]=1;
//上面两个循环是边界处理,因为不能走出方阵,所以将边界设为1,防止出界
f[1][1]=1;
dfs(1,1,1,0);//从1,1点开始搜索
printf("%d\n",ans);//输出
return 0;
}

写题解不易,点个赞呗。

P1585 魔法阵 题解的更多相关文章

  1. 洛谷 P2119 魔法阵 题解

    Analysis 这道题也是考试题,我也依然打了个n三次方暴力.正解是先枚举差,再枚举c和d,a和b用乘法原理优化,这样就能大大减少时间. #include<iostream> #incl ...

  2. (算是dp吧) 小茗的魔法阵 (fzu 2225)

    http://acm.fzu.edu.cn/problem.php?pid=2225   Problem Description 在打败了易基•普罗布朗.诺姆•普罗布朗之后,小茗同学开始挑战哈德•普罗 ...

  3. FZU 2099 魔法阵(计算几何)

     Problem 2099 魔法阵 Accept: 120    Submit: 289 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

  4. NOI2014魔法森林题解报告

    题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,-,n,边标号为 1,2,3,-, ...

  5. BZOJ3669:[NOI2014]魔法森林——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3669 https://www.luogu.org/problemnew/show/P2387 为了得 ...

  6. NOIP2016 T4 魔法阵 暴力枚举+前缀和后缀和优化

    想把最近几年的NOIP T4都先干掉,就大概差16年的,所以来做一做. 然后这题就浪费了我一整天QAQ...果然还是自己太弱了QAQ 点我看题 还是pa洛谷的... 题意:给m个物品,每个物品有一个不 ...

  7. FZU 2225 小茗的魔法阵 扫描线+树状数组

    这个题和一个CF上的找"Z"的题差不多,都是扫描线+树状数组 从右上角的主对角线开始扫描,一直扫到左下角,每次更新,右延伸等于该扫描线的点,注意在其所在的树状数组更新就好了 时间复 ...

  8. [P2119]魔法阵 (模拟?搜索?)

    很玄学 我暴力都没做出来 #include <cstdio> ],vis[],a[],b[],c[],d[]; int main() { //freopen("magic.in& ...

  9. [NOI2014]魔法森林题解

    这道题正解其实是LCT,然而貌似SPFA也可以成功水过,所以根本不知道LCT的我只能说SPFA了. 这道题最大的限制是两种精灵就意味着一条道可能有两个权值,因此我们需要去将其中一个固定,然后再推另一个 ...

  10. 洛谷2387 BZOJ3669魔法森林题解

    题目链接 BZ链接 这道题被很多人用spfa水了过去,表示很... 其实spfa很好卡,这组数据可以卡掉大多数spfa 链接:密码:rjvk 这里讲一下LCT的做法 我们按照a将边排序,然后依次添加 ...

随机推荐

  1. jquery中判断复选框有没有被选上

    页面部分: <input type="checkbox" id="cbx" /><label for="cbx">点 ...

  2. 企业实践 | 国产操作系统之光? 银河麒麟KylinOS-V10(SP3)高级服务器操作系统基础安装篇

    [点击 关注「 全栈工程师修炼指南」公众号 ] 设为「️ 星标」带你从基础入门 到 全栈实践 再到 放弃学习! 涉及 网络安全运维.应用开发.物联网IOT.学习路径 .个人感悟 等知识分享. 希望各位 ...

  3. .NET快速开发框架-RDIFramework.NET 全新EasyUI版发布

    RDIFramework.NET,基于.NET的快速信息化系统快速开发框架.10年专注.易上手.多组件.全源码.可灵活构建各类型系统. 1.RDIFramework.NET快速开发框架简介 RDIFr ...

  4. String知识点整理

    使用双引号创建字符串时,JVM会现在字符串常量池中查找是否已存在该字符串,存在则返回,不存在则在池中创建后再返回.与此同时,使用String的intern方法也是类似处理. 使用new String的 ...

  5. 理解Linux系统: 进程

    Linux内核版本: 2.6.11.12 编写代码: 创建进程 创建进程使用fork系统调用,官方文档对于fork的描述: fork() creates a new process by duplic ...

  6. TiDB在科捷物流神州金库核心系统的应用与实践

    导读:在经过了近半年的测试验证和迁移准备之后,神州金库3.0核心系统 WMS 正式从 MySQL 迁移到了分布式 HTAP 数据库 TiDB,上线后不久即经历了第一次双11的考验,TiDB的性能和稳定 ...

  7. 第3章. markdown语法

    常用语法 1. 文字格式 1.1 给文字添加引用 在文字的两侧,使用 ` 符号包裹起来 怒发冲冠,凭栏处,潇潇雨歇. 1.2 设置文字样式为斜体 在文字的两侧,使用 * 符号包裹起来 抬望眼,仰天长啸 ...

  8. mysql基础_事务

    定义 一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败. 例如:王五向赵六的账户上转 ...

  9. Spring之丐版IOC实现

    文章目录 IOC控制反转 依赖注入 Bean的自动装配方式 丐版IOC实现 BeanDefinition.java ResourceLoader.java BeanRegister.java Bean ...

  10. NC19427 换个角度思考

    题目链接 题目 题目描述 给定一个序列,有多次询问,每次查询区间里小于等于某个数的元素的个数 即对于询问 \((l,r,x)\) ,你需要输出 \(\sum_{i=l}^{r}[a_i \le x]\ ...