试题描述
在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 拯救瑞恩的更多相关文章

  1. 2019西安多校联训 Day2

    试题链接:http://www.accoders.com/contest.php?cid=1894   考试密码请私信; T1 残忍WA 0,明明就是一道非常菜的字符串QAQ 思路:一共找四种东西,A ...

  2. 拯救无法启动的虚拟机文件.vmdk中的数据

    FROM: http://blog.csdn.net/npy_lp/article/details/7686583 从事Linux开发的软件工程师几乎都使用过虚拟机软件,如VMware worksta ...

  3. 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动

    一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...

  4. 一次U盘拯救的经历

    U盘拷资料,突然就弹出框框,复制终止了,然后U盘里面的只是编程可读的了. 倒是没有啥重要的资料,就是只有这一个U盘了,平时传资料都靠它,不能就这么垮了啊,于是就来了一次拯救行动. 一共有三个步骤 第一 ...

  5. OpenJudge4980:拯救行动//stl优先队列

    总时间限制:  10000ms 内存限制:  65536kB 描述 公主被恶人抓走,被关押在牢房的某个地方.牢房用N*M (N, M <= 200)的矩阵来表示.矩阵中的每项可以代表道路(@). ...

  6. 【BZOJ-3174】拯救小矮人 贪心 + DP

    3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 686  Solved: 357[Submit][Status ...

  7. SQLSERVER拯救某个时间点被误删除的数据

    SQLSERVER拯救某个时间点被误删除的数据 转载自:http://blog.csdn.net/dba_huangzj/article/details/8491327 要拯救某个时间点被误删除的数据 ...

  8. 我发现:在StackOverflow上拯救歪果仁十分有意思!

    菊长:火星特工们!今天是周五了,大家有什么提议? BeJavaGod:报告菊长!我发现,在StackOverflow上拯救歪果仁十分有意思! 噗哈哈,时不时遇到问题会使用到StackOverflow, ...

  9. 拿什么来拯救你,我的table

    分类: Html/CSS | 转载请注明: 出自 海玉的博客 本文地址: http://www.hicss.net/how-to-save-you-my-table/ table曾经在网页开发中占据着 ...

随机推荐

  1. django signal 浅析

    默认的signals极其参数 (django 1.6.5) 模型的(django/db/models/signal.py): from django.dispatch import Signal cl ...

  2. FastCgi与PHP-fpm之间是个什么样的关系

    刚开始对这个问题我也挺纠结的,看了<HTTP权威指南>后,感觉清晰了不少. 首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. ...

  3. SQL SERVER 中的事务

    所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位.例如,在关系数据库中,一个事务可以是一条SQL语句.一组SQL语句或整个程序. 简单举个例子就是 你要同时 ...

  4. 【Python】Django 如何直接返回404 被 curl,wget 捕获到

    代码示例: from django.http import Http404, HttpResponseNotFound #raise Http404(filename) return HttpResp ...

  5. Mysql数据库中设置root密码的命令及方法

    我们都知道通常PHP连接 Mysql都是通过root用户名和密码连接,默认情况下在Mysql安装时root初始密码为空,在安装使用PHP开源系统时,都需要填写连接Mysql数据库的用户名和密码,此时当 ...

  6. LightOJ 1234 Harmonic Number (打表)

    Harmonic Number Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submi ...

  7. ImageView中XML属性src和background的区别

    background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸. src是图片内容(前景),bg是背景,可以同时使用. 此外:scaleType只对sr ...

  8. 二、JavaScript语言--JS基础--JavaScript进阶篇--流程控制语句

    1.if语句--做判断 if语句是基于条件成立才执行相应代码时使用的语句. 语法: if(条件) { 条件成立时执行代码} 注意:if小写,大写字母(IF)会出错! 假设你应聘web前端技术开发岗位, ...

  9. 开启InnoDB每表一个独立的表空间

    mysql> show variables like '%innodb%'; +---------------------------------+----------------------- ...

  10. hive笔记(自学整理的)

    第一部分:用户管理 创建用户:CREATE DATABASE XXX 查看用户:SHOW DATABASES; 关键查看用户:show databases like 'de.*'   讲解:创建一个用 ...