http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2193

救基友记3

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

  话说CZ由于不守基道,被妖怪抓走了,好基友WP在努力讨好高富帅RQ救出CZ的同时,CZ也意识到了自己的错误,然后努力的想逃出妖怪的闺房。 

妖怪的闺房是一个n*m的矩阵,并且某些地方安装了带锁的门,钥匙藏在闺房另外的某些地方。刚开始WP被关在(sx,sy)的位置,离开闺房的门在(ex,ey)的位置。WP每分钟只能从一个坐标走到相邻四个坐标中的其中一个。妖怪每t分钟回闺房视察一次,若发现CZ不在原位置便把他再拎回去。经过若干次的尝试,CZ已画出整个闺房的地图。现在请你帮他计算能否再次成功逃亡。只要在妖怪下次视察之前走到出口就算离开闺房,如果妖怪回来的时候刚好走到出口或还未到出口都算逃亡失败。

输入

 每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为闺房的地图,其中包括:
. 代表路
* 代表墙
@ 代表CZ的起始位置
^ 代表闺房的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J

每组测试数据之间有一个空行。

输出

 针对每组测试数据,如果可以成功逃亡,请输出最少需要多少分钟才能离开,如果不能则输出-1。

示例输入

4 5 17
@A.B.
a*.*.
*..*^
c..b* 4 5 16
@A.B.
a*.*.
*..*^
c..b*

示例输出

16
-1 通过二进制来记录是否已经得到钥匙,例如101010101 说明已经得到a,c,e,g,i钥匙。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
int n,m,tt;
struct node
{
int x,y,z;
int ans;
} q[];
char map[][];
int v[][][];
int jx[]= {,-,,};
int jy[]= {,,,-};
void bfs(int xx,int yy)
{
memset(v,,sizeof(v));
int s=;
int e=;
struct node t,f;
t.x=xx;
t.y=yy;
t.ans=;
t.z=;
q[e++]=t;
v[t.x][t.y][]=;
while(s<e)
{
t=q[s++];
if(map[t.x][t.y]=='^')
{
if(t.ans<tt)
{
printf("%d\n",t.ans);
return ;
}
else
{
printf("-1\n");
return ;
} }
for(int i=; i<; i++)
{
f.x=t.x+jx[i];
f.y=t.y+jy[i];
f.z=t.z;
if(f.x>=&&f.x<n&&f.y>=&&f.y<m&&v[f.x][f.y][f.z]==&&map[f.x][f.y]!='*')//因为钥匙的变化,f.z也会变化,所以有钥匙和没钥匙走的是不同的路线
{
if(map[f.x][f.y]>='a'&&map[f.x][f.y]<='j')
{
int s1,s2,s3;
s1=map[f.x][f.y]-'a';
s2=f.z;
while(s1--)//判断之前有没有拿到过着把钥匙
{
s2=s2/;
}
s3=s2%;
if(s3==)
{
s1=map[f.x][f.y]-'a';
s2=;
while(s1--)
{
s2=s2*;
}
f.z=f.z+s2;
}
f.ans=t.ans+;
q[e++]=f;
v[f.x][f.y][f.z]=;
}
else if(map[f.x][f.y]>='A'&&map[f.x][f.y]<='J')
{
int s1,s2,s3;
s1 = map[f.x][f.y] - 'A';
s2 = f.z;
while(s1--)
{
s2 /= ;
}
s3 = s2 % ;//判断之前有没有拿到钥匙
if(s3 == )
{
f.ans = t.ans + ;
q[e++]=f;
v[f.x][f.y][f.z]=;
}
}
else
{
f.ans=t.ans+;
f.z=t.z;
v[f.x][f.y][f.z]=;
q[e++]=f;
}
}
}
}
printf("-1\n");
}
int main()
{
int x,y,j;
while(scanf("%d%d%d",&n,&m,&tt)!=EOF)
{
for(int i=; i<n; i++)
scanf("%*c%s",map[i]);
for(int i=; i<n; i++)
{
for(j=; j<m; j++)
{
if(map[i][j]=='@')
{
x=i;
y=j;
break;
}
}
if(j!=m) break;
}
bfs(x,y);
}
return ;
}

sdut2193救基友记3(三维)的更多相关文章

  1. 救基友3(三维BFS)

    救基友记3 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述   话说CZ因为不守基道.被妖怪抓走了.好基友WP在努力讨好高富帅 ...

  2. Java练习 SDUT-2192_救基友记2

    救基友记2 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 屌丝WP的好基友CZ又被妖鬼给抓走了(CZ啊,CZ-.怎么说 ...

  3. SDUT2190救基友记1

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2190 思路 : 这个题,一开始以为是博弈,以为 ...

  4. Java常用类、集合框架类1

    A   时间日期格式转换(SDUT 2246)(SimpleDateFormat用法) 转换的df2里面时间是US,上面的df1可以是CHINA或者US. package test; import j ...

  5. 线性代数与Python

    1.向量1.1向量例子1.2向量加法与减法1.3向量的乘法2.矩阵2.1矩阵例子2.2矩阵的形状2.3矩阵的创建函数 1.向量 向量是指可以加总(以生成新的向量),可以乘以标量(即数字),也可以生成新 ...

  6. 小P寻宝记——好基友一起走

    小P寻宝记--好基友一起走 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 话说.上次小P到伊利哇呀国旅行得到了一批宝藏.他是 ...

  7. (全然背包)小P寻宝记——好基友一起走

    题目描写叙述 话说.上次小P到伊利哇呀国旅行得到了一批宝藏.他是相当开心啊.回来就告诉了他的好基友小鑫.于是他们又结伴去伊利哇呀国寻宝. 这次小P的寻宝之路可没有那么的轻松,他们走到了一个森林,小鑫一 ...

  8. 01背包--小P寻宝记——粗心的基友

    题目描写叙述 这对好基友他们在经历无数的艰难险阻后.最终找到了宝藏.无奈的是这一对好基友居然是一样的粗心,又忘记了带一个大一点的包包,可惜啊..选择又出现了啊.. 已知包的体积是v,每种宝贝仅仅有一种 ...

  9. 记一次联想A820t救砖线刷

    因为是看着教程刷的(有大神放出教程,只管伸手拿来就好啦)但是照着教程做的过程中出现了一些问题还是值得注意的,在这里总结一下,给新手提供一点建议 教程比较长,我放到博客的文件中,需要的自己下载一下.或者 ...

随机推荐

  1. TCP端口号范围及分类

    https://blog.csdn.net/my_heart_/article/details/52601924 端口号的范围是从1-65535 端口的概念:  在网络技术中,端口(Port)大致有两 ...

  2. spring基础---->spring自定义初始化(二)

    这里新增了对ref属性的支持,并且过滤了已经解析的元素.人生有两个词很棒,一言不合和不提也罢. spring自定义对ref属性支持 项目的结构如下:新增一个ThirdBean类,修改了ParseXml ...

  3. OGG 3节点级联时 关键参数

    目标架构为: node1-> node2->node3 node1-> node2 已经同步中,只是需要在此基础上做个node2 ->node3 的同步. 部署后发现 node ...

  4. sonarqube插件开发(三) 调试插件

    环境 windows + eclipse +sonarqube server 5.6.4 准备 新建一个maven项目,其中加入了一些插件所用的jar <project xmlns=" ...

  5. C语言位操作初步

    位操作允许程序员对单独的位进行操作,例如,早某些机器上,短整型占16位,位操作将每一位单独操作. 位操作允许程序员设置.清除.测试与其他的操作,这些操作如下表: 操作 含义 & 按位与 | 按 ...

  6. HP P2xxx/MSA SMI-S Provider

    HP P2xxx/MSA SMI-S Provider The HP MSA provider must be enabled before it can be monitored. For more ...

  7. java的前缀自增自减和后缀自增自减

    2.前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算. 3.后缀自增自减法(a++,a--): 先进行表达式运算,再进行自增或者自减运算 实例: 实例 public cla ...

  8. SqlServer数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述) Value ) AS value FROM sysobjects a Where a.xtype = 'U' AND a.name <> 'sysdiagram ...

  9. POJ 3280 - Cheapest Palindrome - [区间DP]

    题目链接:http://poj.org/problem?id=3280 Time Limit: 2000MS Memory Limit: 65536K Description Keeping trac ...

  10. [INS-20802] Oracle Net Configguration Assistant faild

    Redhat/Centos 安装oracle11gR2时出现以下错误: [INS-20802] Oracle Net Configuration Assistant failed 查看对应日志文件,信 ...