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曾经在网页开发中占据着 ...
随机推荐
- HDOJ 1690
Bus System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 41.把数组排成最小的数[Sort array to smallest value]
[题目] 输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{3,32, 321},则输出这两个能排成的最小数字321323.请给出解决问题的算法,并证明该 ...
- Android clickable 和 focusable
setClickable(),好像是控制按钮是否可以被点击和点击之后触发监听器事件.setFocusable();控制键盘是否可以获得这个按钮的焦点.(我按实体键盘上方向键,button被选中) 今天 ...
- 转mysql存储引擎memory,ndb,innodb之选择
1 mysql的innodb和cluster的NDB引擎都支持事务,在有共同的特性外,也有不同之处:以mysql cluster NDB 7.3和MySQL 5.6之InnoDB为例:ndb7.3基于 ...
- codeforces 489A.SwapSort 解题报告
题目链接:http://codeforces.com/problemset/problem/489/A 题目意思:给出一个 n 个无序的序列,问能通过两两交换,需要多少次使得整个序列最终呈现非递减形式 ...
- git_2-linux
在linux下搭建git环境1.创建Github账号,https://github.com2.Linux创建SSH密钥: ssh-keygen ##一直默认就可以了 3.将公钥加入到Github账户 ...
- SQL 代码创建表格以及CRUD
create table <表名>( <列名> <数据类型及长度> [not null], <列名> <数据类型及长度>, ... < ...
- OpenStack Keystone安装部署流程
之前介绍了OpenStack Swift的安装部署,采用的都是tempauth认证模式,今天就来介绍一个新的组件,名为Keystone. 1. 简介 本文将详细描述Keystone的安装部署流程,并给 ...
- 一个非常简单的返回局部字符数组的C语言程序, 请问其输出结果?
以下是该无聊的程序: #include <stdio.h> #include <string.h> char* get_str() { int x[10]; c ...
- mac平台scala开发环境搭建
到scala官网,下载scala的sdk,地址:http://www.scala-lang.org/download/ adeMacBook-Pro:scala- apple$ wget http:/ ...