COJ 拯救瑞恩
|
试题描述
|
|
在n行n列的字符方阵中I表示“我”最初所在位置,R是大兵瑞恩所在位置。4<n<11。
“我”从当前位置可以向上、或下、或左、或右移动一格,只要新点无障碍且未出界。 标有“.”的位置可以通过,标有“*”的位置是障碍物,不能到达和通过。 标有字母A~G的位置代表“门”,是有条件的障碍物,1~7依次是A~G的钥匙。 走到某个门时,若已走路径未经过其钥匙,则门视为“*”,若已经过其钥匙则视为“.”。 求“我”到达瑞恩的位置至少要走多少步?若无法到达输出-1。 |
|
输入
|
|
输入文件SAVE.IN中共n行n列字符,均为题目所述的字符。字符间无空格。
|
|
输出
|
|
输出文件SAVE.OUT中仅有答案一个整数。
|
|
输入示例
|
|
6
...... ...... .I.3.. .**2*. .**1*C .A*R*B |
|
输出示例
|
|
27
|
设状态为(x,y,S)表示当前在(x,y),拥有的钥匙集合为S,BFS即可。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
struct Arr {int x,y,S;};
char A[][];
int n,vis[][][<<],d[][][<<];
const int mx[]={,-,,},my[]={,,,-};
queue<Arr> Q;
void bfs(int x,int y,int S) {
vis[x][y][S]=;Q.push((Arr){x,y,S});
while(!Q.empty()) {
x=Q.front().x;y=Q.front().y;S=Q.front().S;Q.pop();
rep(dir,,) {
int x2=x+mx[dir],y2=y+my[dir],S2=S;
if(x2<||x2>n||y2<||y2>n) continue;
if(A[x2][y2]=='*') continue;
if(isdigit(A[x2][y2])&&!(S&(<<(A[x2][y2]-'')))) continue;
if(isalpha(A[x2][y2])) S2|=(<<(A[x2][y2]-'A'));
if(!vis[x2][y2][S2]) {
vis[x2][y2][S2]=;
d[x2][y2][S2]=d[x][y][S]+;
Q.push((Arr){x2,y2,S2});
}
}
}
}
int main() {
int x1,x2,y1,y2;
n=read();
rep(i,,n) scanf("%s",A[i]+);
rep(i,,n) rep(j,,n) {
if(A[i][j]=='I') x1=i,y1=j,A[i][j]='.';
if(A[i][j]=='R') x2=i,y2=j,A[i][j]='.';
}
bfs(x1,y1,);
int ans=1e9;
rep(S,,<<) if(vis[x2][y2][S]) ans=min(ans,d[x2][y2][S]);
if(ans!=1e9) printf("%d\n",ans);
else puts("-1");
return ;
}
COJ 拯救瑞恩的更多相关文章
- 2019西安多校联训 Day2
试题链接:http://www.accoders.com/contest.php?cid=1894 考试密码请私信; T1 残忍WA 0,明明就是一道非常菜的字符串QAQ 思路:一共找四种东西,A ...
- 拯救无法启动的虚拟机文件.vmdk中的数据
FROM: http://blog.csdn.net/npy_lp/article/details/7686583 从事Linux开发的软件工程师几乎都使用过虚拟机软件,如VMware worksta ...
- 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动
一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...
- 一次U盘拯救的经历
U盘拷资料,突然就弹出框框,复制终止了,然后U盘里面的只是编程可读的了. 倒是没有啥重要的资料,就是只有这一个U盘了,平时传资料都靠它,不能就这么垮了啊,于是就来了一次拯救行动. 一共有三个步骤 第一 ...
- OpenJudge4980:拯救行动//stl优先队列
总时间限制: 10000ms 内存限制: 65536kB 描述 公主被恶人抓走,被关押在牢房的某个地方.牢房用N*M (N, M <= 200)的矩阵来表示.矩阵中的每项可以代表道路(@). ...
- 【BZOJ-3174】拯救小矮人 贪心 + DP
3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 686 Solved: 357[Submit][Status ...
- SQLSERVER拯救某个时间点被误删除的数据
SQLSERVER拯救某个时间点被误删除的数据 转载自:http://blog.csdn.net/dba_huangzj/article/details/8491327 要拯救某个时间点被误删除的数据 ...
- 我发现:在StackOverflow上拯救歪果仁十分有意思!
菊长:火星特工们!今天是周五了,大家有什么提议? BeJavaGod:报告菊长!我发现,在StackOverflow上拯救歪果仁十分有意思! 噗哈哈,时不时遇到问题会使用到StackOverflow, ...
- 拿什么来拯救你,我的table
分类: Html/CSS | 转载请注明: 出自 海玉的博客 本文地址: http://www.hicss.net/how-to-save-you-my-table/ table曾经在网页开发中占据着 ...
随机推荐
- rocksdb 编译安装 日志
Compilation RocksDB's library should be able to compile without any dependency installed, although w ...
- linux 下查看某个端口是否被占用
lsof -i:端口号 转自: http://my.oschina.net/u/193184/blog/146885
- Eclipse 项目红色叹号:Build Path Problem
Description Resource Path Location TypeA cycle was detected in the build path of project 'shgl-categ ...
- Android读写assets、raw、sdard和工程文件的方法
Android开发离不开对文件的操作,前面的文章“Android简易数据存储之SharedPreferences”和“Android数据存储之SQLite的操作”,分别讲解了简单的数据的存储和数据库数 ...
- Android 中PendingIntent---附带解决AlarmManager重复加入问题
最近在程序中使用到了notification功能,自然,就涉及到了PendingIntent,下面总结下. 1 什么是PendingIntent A description of an Intent ...
- Java for LeetCode 023 Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 解 ...
- Cookie的使用与实现记住用户名案例
学习web开发,使用Cookie是不可避免的,个人感觉Cookie的使用和ASP.NET中的Session非常像,只不过Cookie是保存在客户端,而Session是在服务器端,两者都以记录信息为目的 ...
- vector data() [c++11]
Example 12345678910111213141516171819202122 // vector::data #include <iostream> #include <v ...
- Snmp配置
http://www.07net01.com/linux/CentOSxiaSNMPfuwuanzhuang_496848_1372907142.html
- Git入门学习和应用笔记
>>关于Git 1.BitMover公司收回Linux社区的BitKeeper免费使用权,Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git.2.什么是集中式版本控制系 ...