胜利大逃亡(续)

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7357    Accepted Submission(s): 2552

Problem Description
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……
这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
 
Input
每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为地牢的地图,其中包括:
. 代表路 * 代表墙 @ 代表Ignatius的起始位置 ^ 代表地牢的出口 A-J 代表带锁的门,对应的钥匙分别为a-j a-j 代表钥匙,对应的门分别为A-J
每组测试数据之间有一个空行。
 
Output
针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-1。
 
Sample Input
4 5 17
@A.B.
a*.*.
*..*^
c..b*

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

 
Sample Output
16
-1
 
Author
LL
 

题解:状态压缩bfs,比赛的时候无限me。。。。心中一万头草泥马奔腾。。。最后大家都说用状态压缩记录钥匙,,,瞬间感觉自己智商负无穷了。。。

其实也不难想,关键以前没怎么用状态压缩;当时想到了用vis存位置以及钥匙数,但是不知道怎么记录,为什么想不到状态压缩呐。。。要长记性了;

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
struct Node{
int nx,ny,step;
//int key[11];
int key;
};
char mp[][];
int vis[][][];
int disx[] = {,,,-};
int disy[] = {,-,,};
int n,m,t;
void bfs(int sx,int sy){
memset(vis,,sizeof(vis));
queue<Node>q;
Node a,b;
a.nx = sx;a.ny = sy;
a.step = ;
//for(int i = 0;i < 11;i++)a.key[i] = 0;
a.key = ;
vis[sx][sy][] = ;
q.push(a);
while(!q.empty()){
a = q.front();
q.pop();
for(int i = ; i < ;i++){
b.nx = a.nx + disx[i];
b.ny = a.ny + disy[i];
b.step = a.step + ;
int x = b.nx, y = b.ny, step = b.step;
//for(int i = 0;i < 11;i++)b.key[i] = a.key[i];
b.key = a.key;
if(x < || y < || x >= n || y >= m)continue;
if(mp[x][y] == '*')continue;
if(step >= t)continue;
if(mp[x][y] == '^'){
printf("%d\n",step);
return;
}
// if(vis[x][y] > 10)continue;
if(mp[x][y] >= 'a' && mp[x][y] <= 'j'){
//b.key[mp[x][y] - 'a'] = 1;
int p = << (mp[x][y] - 'a');
b.key |= p;
if(!vis[x][y][b.key]){
vis[x][y][b.key] = ;
q.push(b);
}
continue;
}
if(mp[x][y] >= 'A' && mp[x][y] <= 'J'){
//if(b.key[mp[x][y] - 'A'] == 0)continue;
int p = << (mp[x][y] - 'A');
if(b.key & p){
if(!vis[x][y][b.key]){
vis[x][y][b.key] = ;
q.push(b);
}
}
continue;
}
if(!vis[x][y][b.key]){
vis[x][y][b.key] = ;
q.push(b);
}
}
}
puts("-1");
return;
}
int main(){
while(~scanf("%d%d%d",&n,&m,&t)){
int sx,sy;
for(int i = ;i < n; i++){
scanf("%s",mp[i]);
for(int j = ;j < m; j++){
if(mp[i][j] == '@'){
sx = i;
sy = j;
}
}
}
mp[sx][sy] = '.';
bfs(sx,sy);
}
return ;
}

胜利大逃亡(续)(状态压缩bfs)的更多相关文章

  1. 胜利大逃亡(续)hdu1429(bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  2. HDU 1429 胜利大逃亡(续)(三维BFS)

    题目链接 题意 : 中文题不详述. 思路 : 这个题和1885差不多一样的,所以我直接改了改那个代码就交上了,链接 #include <stdio.h> #include <stri ...

  3. 胜利大逃亡(续)(bfs+状态压缩)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  4. HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  5. hdoj 1429 胜利大逃亡(续) 【BFS+状态压缩】

    题目:pid=1429">hdoj 1429 胜利大逃亡(续) 同样题目: 题意:中文的,自己看 分析:题目是求最少的逃亡时间.确定用BFS 这个题目的难点在于有几个锁对于几把钥匙.唯 ...

  6. hdu 1429 胜利大逃亡(续)(bfs+位压缩)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  7. HDU 1429 胜利大逃亡(续)(DP + 状态压缩)

    胜利大逃亡(续) Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢 ...

  8. hdu.1429.胜利大逃亡(续)(bfs + 0101011110)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. HDU 1429 胜利大逃亡(续)(bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

随机推荐

  1. UVA_Cubic Eight-Puzzle UVA 1604

    Let's play a puzzle using eight cubes placed on a 3 x 3 board leaving one empty square.Faces of cube ...

  2. Mysql 添加用户和数据库授权

    注:我的运行环境是widnows xp professional + MySQL5.0 一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY ...

  3. Python的字符串与数字

    Python3.0通过“input”实现读取控制台的输入与用户实现交互.值得注意的是input接受的所有数据都是字符串,即使输入的是数字,依然会被当作字符串来处理.这就会出现一些问题,所以需要进行类型 ...

  4. java web分页查询初试

    ssh2分页查询初试,放着记录学习一下. entity:student.java: package com.zte.entity; /** * 数据持久化,跟数据库的的相应的表的字段是对应的. * * ...

  5. Java获取客户端真实IP地址的两种方法

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  6. SSH框架-unexpected token: * near line 1, column 8 [select * from tb_chaper where course_id = 2];报错解决方法

    SSH项目,访问jsp页面出现报错,控制台显示报错信息: org.springframework.orm.hibernate3.HibernateQueryException: unexpected ...

  7. LR如何利用siteScope监控MySQL性能

    本次实验,是在自己的电脑上使用APMServ5.2.6部署Discuz2.X论坛下,对该论坛的数据库MySQL5.1进行性能测试的,下面讲述LoadRunner在设计场景时,如何利用siteScope ...

  8. 初次使用Oracle

    这是我第一次写博客,主要是记录下自己这半个多月以来的学习笔记,以备以后可以随时查看. 首先就是安装Oracle的问题的,我系统是Win7 64位的,出现各种问题郁闷得不行,最终安装个Oracle102 ...

  9. [Effective Modern C++] Item 6. Use the explicitly typed initializer idiom when auto deduces undesired types - 当推断意外类型时使用显式的类型初始化语句

    条款6 当推断意外类型时使用显式的类型初始化语句 基础知识 当使用std::vector<bool>的时候,类型推断会出现问题: std::vector<bool> featu ...

  10. ado.net实现一个通知公告功能

    一.建立相应的数据库,此处就不多说了,相信大家都非常了解