洛谷P1585 魔法阵
题目传送门
这题就是一个有技巧的DFS+一大堆乱七八糟的剪枝
进行DFS时注意一下以下点
根据题意,我们可以把DFS分成两块,即
1--n*m/2
与n*m/2--n*m
,第一块边找边记录,第二块就开始计算其实左上角与右上角开始没有任何区别
剪枝
- 可行性剪枝:判断上下与左右走过没有
(画风丑,勿喷)如图所示,当上下两格都走过或左右两个都走过时,
无论怎么走也是遍历完整张图的(自己去画画看就知道了)
- 最优性剪枝:判断当前最大值是否大于答案
这样下来就行了
看代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,m,k1,k2,ans=0x3f3f3f3f;
int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};//四个方向
int num[60][2];//用于第一次记录,下面会提
bool vis[60][60];//标记走过没
inline void dfs(int x,int y,int sum,int maxn)//x表示当前x坐标,y表示当前y坐标,sum表示当前步数,maxn表示当前最大值
{
//cout<<x<<" "<<y<<" "<<sum<<" "<<maxn<<endl;
if(vis[x-1][y]&&vis[x+1][y]&&!vis[x][y+1]&&!vis[x][y-1])return;//可行性剪枝1
if(vis[x][y-1]&&vis[x][y+1]&&!vis[x+1][y]&&!vis[x-1][y])return;//可行性剪枝2
if(sum<=t)num[sum][0]=x,num[sum][1]=y;//记录,这里t指一半
else
{
maxn=max(maxn,k1*abs(num[sum-t][0]-x)+k2*abs(num[sum-t][1]-y));//进行计算并更新
//return;
}
if(sum>=n*m)
{
ans=min(ans,maxn);//如果遍历完,那么更新答案
return;
}
if(maxn>=ans)return;//最优性剪枝
/*for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=m+1;j++)cout<<vis[i][j];
cout<<endl;
}*/
for(int i=1;i<=4;i++)//四个方向枚举
{
int a=x+dx[i],b=y+dy[i];
if(!vis[a][b])
{
vis[a][b]=1;
//cout<<sum<<endl;
dfs(a,b,sum+1,maxn);
//cout<<sum<<endl;
vis[a][b]=0;//回溯
}
}
}
int main()
{
cin>>n>>m>>k1>>k2;
t=n*m/2;
for(int i=0;i<=m+1;i++)
{
vis[0][i]=1;
vis[n+1][i]=1;
}//在外围加个边框1
for(int i=0;i<=n+1;i++)
{
vis[i][0]=1;
vis[i][m+1]=1;
}//在外围加个边框2
vis[1][1]=1;//初始标记
/*num[1][0]=1;
num[1][0]=1;
/*for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=m+1;j++)cout<<vis[i][j];
cout<<endl;
}*/
dfs(1,1,1,0);
cout<<ans<<endl;
return 0;
}
洛谷P1585 魔法阵的更多相关文章
- 洛谷 P2119 魔法阵
题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有mm个魔法物品,编号分别为1,2,...,m1,2,...,m.每个物品具有一个魔法值,我们用X_iXi ...
- 洛谷P2119 魔法阵
P2119 魔法阵 题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法值,我们用Xi表示编 ...
- [洛谷P2730] 魔板 Magic Squares
洛谷题目链接:魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都 ...
- 洛谷P2730 魔板 [广搜,字符串,STL]
题目传送门 魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有 ...
- 洛谷 P2730 魔板 Magic Squares 解题报告
P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...
- 洛谷P1275 魔板
P1275 魔板 题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状 ...
- 洛谷 P2730 魔板 Magic Squares
P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...
- 洛谷 P1275 魔板
P1275 魔板 题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状 ...
- 洛谷 - P2730 - 魔板 Magic Squares - bfs
写状态转移弄了很久,老了,不记得自己的数组是怎么标号的了. #include <bits/stdc++.h> using namespace std; #define ll long lo ...
随机推荐
- IO多路复用(select)
select在操作系统内部,维护了一个for循环,检测对象是否变化.select在各种平台都可使用,但效率不高.select对监听的个数是有限制的(1024) poll与select相同,但是没有监听 ...
- CF893F:Subtree Minimum Query(线段树合并)
Description 给你一颗有根树,点有权值,m次询问,每次问你某个点的子树中距离其不超过k的点的权值的最小值.(边权均为1,点权有可能重复,k值每次询问有可能不同,强制在线) Input 第一行 ...
- jenkins 基本插件
- ethers.js-5-Utilities
https://docs.ethers.io/ethers.js/html/api-utils.html 使用时再进行查看即可
- PAT乙级1023
1023 组个最小数 (20 分) 给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1, ...
- redis缓存穿透和缓存失效的预防和解决
缓存穿透: 认识 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透. 解决办法: 对所 ...
- R语言爬虫:使用R语言爬取豆瓣电影数据
豆瓣排名前25电影及评价爬取 url <-'http://movie.douban.com/top250?format=text' # 获取网页原代码,以行的形式存放在web 变量中 web & ...
- 数据结构与算法之排序(4)希尔排序 ——in dart
研究了网上大部分的希尔排序代码,发现大部分都是互相抄的——因为网上甚至某些书上的实现大部分都是错的.希尔排序是插入排序的升级版,通过引入间隔,然后分组进行插入排序.再逐步缩小间隔,直至间隔为1时,做全 ...
- Docker-CE-CentOS安装&更新&卸载
准备工作 系统准备 要求centos-7以上版本(包含7) 开启centos-extras 在线安装方式要求 卸载旧版本 卸载旧版本docker yum remove docker \ docker- ...
- 2017-2018-3 20155337《信息安全系统设计基础》 pwd指令学习
2017-2018-3 20155337<信息安全系统设计基础> pwd指令学习 任务要求 学习pwd指令 研究pwd实现需要的系统调用(man -k:grep),写出伪代码 实现mypw ...