【洛谷T7243】【CJOJ2225】【BYVoid S3】珠光宝气阁(潜入辛迪加)
Description
“我们最新的研究成果《毒药研究方案》被可恶的辛迪加偷走了!”作为拉文霍德的一员,你一定感到很震惊,因为它是我们最尖端的科研人员的一年的研究成果。被辛迪加获得,我们可能会有灭顶之灾。
狡猾的辛迪加为了躲避我们的追杀,他们并没有把《毒药研究方 案》带回激流堡,而是把它藏了起来。但是终究是我们技高一筹,运用侏儒的最新研究成果“静电放射探测器”,我们已经发现了他们的藏身之地。原来他们早就在 奥特兰克山脉的地下修建了一个巨大的城市,现在,他们就把《毒药研究方案》放在了城市的最深处。更好的消息是,我们已经发现了地下城的入口。
作为一名出色的盗贼,你要学会以彼之道,还施彼身——把《毒药研究方案》偷回来。然而辛迪加布置了严密的防御,更糟糕的是,他们从地精购买了电磁监视器。无论你的潜行技巧有多么高明,只要一接近它,就会出发警报。只有破坏它的供电系统,才能电磁监视器悄无声息得失效。
现在,“静电放射探测器”已经为我们生成了一张地图,它可以告诉你整个地下城的布局结构,包括每一个电磁监视器的位置,及其供电装置的位置。辛迪加的地下城可以被描述为一个N*N的表格,城市的入口在(1,1)处,目标《毒药研究方案》在(N,N)处。每个单元格可能是一片空地、一个障碍物、一个辛迪加卫士、一个电磁监视器、或者一个的供电装置。
从入口处开始,每步你只能上、下、左、右移动到相邻的一个单元 格,不可以停留在原地。你只能进入空地,或者失去供电系统的电磁监视器的位置,或者摧毁供电装置。你不能移动到障碍物上,也不能进入辛迪加卫士的视线中。 辛迪加卫士可以监视自己所在单元格以及上下左右共五格的位置,而且他们的视线可以重叠。你不能杀死辛迪加卫士,也不能被他们发现。每个电磁监视器的供电装 置可能存在,也可能无法破坏或者根本不存在。一个供电装置也可能会对应零个、一个或多个电磁监视器,意味着摧毁它,对应的所有电磁监视器都会失效。(1,1)和(N,N)一定是可以通行的。
拉文霍德要求你在执行任务之前首先给出一个计划书,即要求算出至少一共需要多少步,才能拿到我们的《毒药研究方案》。
Input
第1行,两个整数N, M。表示地图大小为N * N,供电装置的数量为M。
第2-N+1行,每行N个整数,每个整数i可能是0,-1,-2或者一个正整数。i=0表示该位置为一块空地,i=-1表示该位置为一个障碍物,i=-2表示该位置为一个辛迪加卫士。如果i是一个属于[1,M]的正整数,则表示该位置为一个供电装置,其编号为i。如果i是一个大于M的正整数,则表示该位置为一个电磁监视器,它的电力由编号为i-M的供电装置提供。
Output
一个整数,为拿到《毒药研究方案》所需的最少的步数。如果不能到达输出-1.
Sample Input
6 2
0 0 0 -2 -1 2
-1 0 0 0 -1 0
-2 0 0 0 3 3
-2 0 0 -1 -1 4
0 -1 0 0 -1 0
1 0 0 0 -1 0
Sample Output
24
Hint
样例说明
地图如下图,S为入口,T为目标,黑色的单元格为障碍物。每个E表示一个卫兵,(E)为卫兵的监视范围。K1表示供电装置1,K2表示供电装置2。D1表示供电装置为1的电磁监视器,D2表示供电装置为2的电磁监视器。
最优的路线为(1,1) →(1,2) →(2,2) →(2,3) →(3,3) →(4,3) →(5,3) →(6,3) →(6,2) →(6,1)(破坏供电1) →(6,2) →(6,3) →(5,3) →(4,3) →(3,3) →(3,4) →(3,5) →(3,6) →(2,6) →(1,6)(破坏供电2) →(2,6) →(3,6) →(4.6) →(5,6) →(6,6)
数据规模
这道题目的空间限制是512MB
对于15%数据
M=0
对于40%数据
M<=2
对于100%数据
2<=N<=50
0<=M<=16
题解
搜索的好题!
首先,从简单的条件开始逐步考虑
对于每一个守卫而言,直接把他的上下左右四个方格置为障碍物即可(这里注意一点,如果存在几个守卫连着站在一起要注意一下怎么赋值!!!)
守卫的问题解决完了
如何处理电磁监视器和供电呢?
观察数据范围,供电的数量小于16
那么,我们可以使用状态压缩
对于供电装置的破坏和地图的走动关系
开一个50 * 50 * 65536的数组
(内存有512MB,这样开内存是足够的)
那么,对于当前的每一种状态,直接进行BFS就行了
但是这里的细节比较多,需要自己在实现程序的时候注意一下。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;inline int read()
{register int x=0,t=1;register char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-'){t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*t;
}struct Node
{int x,y;//位置int st;//步数int t;//状态
};queue<Node> Q;//队列 int d[4][2]={1,0,-1,0,0,1,0,-1};//方向
bool vis[60][60][65540];//存储位置信息
int g[101][101];//地图
int n,m,x,y,tt;int main()
{freopen("syndicate.in","r",stdin);freopen("syndicate.out","w",stdout);n=read();m=read();memset(g,-1,sizeof(g));//全部赋为障碍 for(register int i=1;i<=n;++i)for(register int j=1;j<=n;++j)g[i][j]=read();for(register int i=1;i<=n;++i)for(register int j=1;j<=n;++j)if(g[i][j]==-2)//如果是一个卫士 for(register int k=0;k<4;++k)if(g[i+d[k][0]][j+d[k][1]]!=-2)g[i+d[k][0]][j+d[k][1]]=-1;//把上下左右都换成障碍(不用管其他的)if(g[1][1]==-1||g[n][n]==-1){cout<<-1<<endl;return 0;}//如果起点或终点就是障碍直接无解 Q.push((Node){1,1,0,0});//放入头结点 while(!Q.empty())//广搜 {Node now=Q.front();//取出头结点 Q.pop();for(register int i=0;i<4;++i)//移动 {x=now.x+d[i][0];y=now.y+d[i][1];if(!vis[x][y][now.t])//当前结点没有拓展过 {vis[x][y][now.t]=true;//标记为拓展过 if(g[x][y]==-1||g[x][y]==-2)continue;//不能够是障碍if(g[x][y]>m)//如果当前位置是监视器{if(now.t&(1<<(g[x][y]-1-m)))//供电已经被破坏Q.push((Node){x,y,now.st+1,now.t});//可以过去 elsecontinue;//不能过去 }elseif(g[x][y]<=m&&g[x][y]>=1)//如果是一个供电装置{if(!(now.t&(1<<(g[x][y]-1))))//没有被破坏{tt=now.t|(1<<(g[x][y]-1));vis[x][y][tt]=true;Q.push((Node){x,y,now.st+1,tt});//标记为破坏并且放入队列 }else//被破坏,可以当做空地走Q.push((Node){x,y,now.st+1,now.t});}elseif(g[x][y]==0)//如果是空地{Q.push((Node){x,y,now.st+1,now.t});}if(x==n&&y==n)//到达了终点{//直接输出结果 cout<<now.st+1<<endl;return 0;}}}}cout<<-1<<endl;//无法到达return 0; }
转载于:https://www.cnblogs.com/cjyyb/p/7197287.html
【洛谷T7243】【CJOJ2225】【BYVoid S3】珠光宝气阁(潜入辛迪加)相关推荐
- 2019.6.7 一场搜索专题的考试【including 洛谷·血色先锋队,入门OJ·兴建高铁,珠光宝气阁
这次分数还好.但全是搜索题还没上200就有点打击人了--[本狸才177QAQ 血色先锋队/血色敢死队 传送门:洛谷P1332 & 入门OJ P2259 Description 邪魔天国领主复活 ...
- 洛谷OJ上的A+B花(zhuang)式(bi)解法
转眼间快到了8月,一想自己都毕业好久了,很怀念曾经在各大OJ上刷题的时光,今天无意在一个算法群里看到最近有个叫洛谷的oj网站貌似蛮火的,于是注册了一个下进去看一看,顺手打开了A+B problem,然 ...
- 二叉树——新二叉树(洛谷 P1305)
题目选自洛谷P1305 这篇用来二叉树入门,讲述遍历二叉树的基本过程代码, 新二叉树只是洛谷的题目叫这个. 对于该题,我们用一个结构体node来表示树的每个结点,这个结构体数组tree来代表一棵树. ...
- 洛谷刷题C语言:Bold、饱食、公平の意、DOM、
记录洛谷刷题C语言qaq [COCI2020-2021#6] Bold 题目描述 Paula 给 Daniel 写了一封信,她需要加粗文本的字体,以便视力恶化的 Daniel 阅读. 信可以用 . 和 ...
- 洛谷——p2392 kkksc03考前临时抱佛脚
今天练习了一些搜索,动态规划的题,只敢选普及-的来做,这个题看上去感觉用贪心来做,而且看上去不知道怎么用背包解题,他的最大"容量"是不确定的. 题目是这样的: [题目背景] kkk ...
- 洛谷P2392 考前临时抱佛脚
题目背景 kkksc03 的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03 需要考 44 科.因此要开始刷习题集,每科 ...
- P2392 kkksc03考前临时抱佛脚(洛谷)JAVA
题目背景 kkksc03 的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03 需要考 4 科.因此要开始刷习题集,每科都 ...
- 【洛谷】P2392 kkksc03考前临时抱佛脚
题目地址: https://www.luogu.com.cn/problem/P2392 题目背景: kkksc03的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不 ...
- 【个人邀请赛】洛谷 Math趣味赛
前言 话说其实写这篇博客是看了之前某 dalao d a l a o dalao这样写,于是我就效仿了一下 不过那位 dalao d a l a o dalao据说公开赛被刷下来了,好像是因为题目过水 ...
最新文章
- Python开发植物大战僵尸游戏(附github项目地址)
- 直播卡顿原因详解及优化
- 在做mvc时遇到的一些问题
- U3D 扩展方法 Dotween tolua
- vue.js初识(一)
- 纽约时代广场广告费才7千元每天,花钱装逼值不值?
- 【Spring Cloud】Redis缓存接入监控、运维平台CacheCloud
- 卖设备 免费报价的网站
- Squid Analyzer 5.1 发布,Squid日志统计
- Harmony OS — TabList和Tab分页栏
- linux tar 命令无效,linux Tar 命令
- PLC编程实例(一) 基本电路
- 黑苹果音频卡顿_DXOMARK公布无线音箱音质基准:苹果华为Sonos上榜
- webaudio ajax,Web Audio 入门之读取左右声道数据
- 人脸识别(Facenet)
- tomcat 乱码问题
- 为什么 JSON 不支持注释?
- 2019年东北大学计算机系提档线,东北大学2019年部分省、批次、科类录取分数线发布!...
- English Learning - L1-12 情态动词 + 倒装 2023.1.12 周四
- 基于macd、kdj、ma技术指标分析股票多空方向——应用开发1 前言
热门文章
- win7剪切板_Win7系统当中清空剪切板的操作方法是什么?
- 东南大学计算机保研预报名,我是一个保研成功的幸运儿,分享我的五个方法—东南大学保研经验...
- 方兴东:我不羡慕陈天桥
- 维护国家安全,捍卫国家主权
- noteexpress 笔记导出_礼拜笔记下载V1.0.6-礼拜笔记安卓版下载
- 变局之下的应变:中国奥园的“三级”推进增长
- java入门-2020-02-27
- ubuntu系统使用quilt命令自定义配置制作补丁包解析
- php个人笔记系统 开源,Github精选!一款开源免费的轻量级笔记软件
- idx1_如何使用WordPress创建IDX房地产网站