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】珠光宝气阁(潜入辛迪加)相关推荐

  1. 2019.6.7 一场搜索专题的考试【including 洛谷·血色先锋队,入门OJ·兴建高铁,珠光宝气阁

    这次分数还好.但全是搜索题还没上200就有点打击人了--[本狸才177QAQ 血色先锋队/血色敢死队 传送门:洛谷P1332 & 入门OJ P2259 Description 邪魔天国领主复活 ...

  2. 洛谷OJ上的A+B花(zhuang)式(bi)解法

    转眼间快到了8月,一想自己都毕业好久了,很怀念曾经在各大OJ上刷题的时光,今天无意在一个算法群里看到最近有个叫洛谷的oj网站貌似蛮火的,于是注册了一个下进去看一看,顺手打开了A+B problem,然 ...

  3. 二叉树——新二叉树(洛谷 P1305)

    题目选自洛谷P1305 这篇用来二叉树入门,讲述遍历二叉树的基本过程代码, 新二叉树只是洛谷的题目叫这个. 对于该题,我们用一个结构体node来表示树的每个结点,这个结构体数组tree来代表一棵树. ...

  4. 洛谷刷题C语言:Bold、饱食、公平の意、DOM、

    记录洛谷刷题C语言qaq [COCI2020-2021#6] Bold 题目描述 Paula 给 Daniel 写了一封信,她需要加粗文本的字体,以便视力恶化的 Daniel 阅读. 信可以用 . 和 ...

  5. 洛谷——p2392 kkksc03考前临时抱佛脚

    今天练习了一些搜索,动态规划的题,只敢选普及-的来做,这个题看上去感觉用贪心来做,而且看上去不知道怎么用背包解题,他的最大"容量"是不确定的. 题目是这样的: [题目背景] kkk ...

  6. 洛谷P2392 考前临时抱佛脚

    题目背景 kkksc03 的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03 需要考 44 科.因此要开始刷习题集,每科 ...

  7. P2392 kkksc03考前临时抱佛脚(洛谷)JAVA

    题目背景 kkksc03 的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03 需要考 4 科.因此要开始刷习题集,每科都 ...

  8. 【洛谷】P2392 kkksc03考前临时抱佛脚

    题目地址: https://www.luogu.com.cn/problem/P2392 题目背景: kkksc03的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不 ...

  9. 【个人邀请赛】洛谷 Math趣味赛

    前言 话说其实写这篇博客是看了之前某 dalao d a l a o dalao这样写,于是我就效仿了一下 不过那位 dalao d a l a o dalao据说公开赛被刷下来了,好像是因为题目过水 ...

最新文章

  1. Python开发植物大战僵尸游戏(附github项目地址)
  2. 直播卡顿原因详解及优化
  3. 在做mvc时遇到的一些问题
  4. U3D 扩展方法 Dotween tolua
  5. vue.js初识(一)
  6. 纽约时代广场广告费才7千元每天,花钱装逼值不值?
  7. 【Spring Cloud】Redis缓存接入监控、运维平台CacheCloud
  8. 卖设备 免费报价的网站
  9. Squid Analyzer 5.1 发布,Squid日志统计
  10. Harmony OS — TabList和Tab分页栏
  11. linux tar 命令无效,linux Tar 命令
  12. PLC编程实例(一) 基本电路
  13. 黑苹果音频卡顿_DXOMARK公布无线音箱音质基准:苹果华为Sonos上榜
  14. webaudio ajax,Web Audio 入门之读取左右声道数据
  15. 人脸识别(Facenet)
  16. tomcat 乱码问题
  17. 为什么 JSON 不支持注释?
  18. 2019年东北大学计算机系提档线,东北大学2019年部分省、批次、科类录取分数线发布!...
  19. English Learning - L1-12 情态动词 + 倒装 2023.1.12 周四
  20. 基于macd、kdj、ma技术指标分析股票多空方向——应用开发1 前言

热门文章

  1. win7剪切板_Win7系统当中清空剪切板的操作方法是什么?
  2. 东南大学计算机保研预报名,我是一个保研成功的幸运儿,分享我的五个方法—东南大学保研经验...
  3. 方兴东:我不羡慕陈天桥
  4. 维护国家安全,捍卫国家主权
  5. noteexpress 笔记导出_礼拜笔记下载V1.0.6-礼拜笔记安卓版下载
  6. 变局之下的应变:中国奥园的“三级”推进增长
  7. java入门-2020-02-27
  8. ubuntu系统使用quilt命令自定义配置制作补丁包解析
  9. php个人笔记系统 开源,Github精选!一款开源免费的轻量级笔记软件
  10. idx1_如何使用WordPress创建IDX房地产网站