这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而Helen达到(1,2),这种情况也算是相遇。

 #include<bits/stdc++.h>
using namespace std;
int _move[][] = {{-, }, {, }, {, -}, {, }};
int visit[][][][];
int Helen_move[];
int n,m;
char _map[][];
struct Node{
int x1, y1;//Paris
int x2, y2;//Helen
int step;
}; Node bfs(int x1, int y1, int x2, int y2, int n, int m){
Node front;
front.x1 = x1;
front.y1 = y1;
front.x2 = x2;
front.y2 = y2;
front.step = ;
queue<Node> q;
q.push(front);
visit[x1][y1][x2][y2] = ;
while(!q.empty()){
front = q.front(); q.pop();
if(front.step > ) {
return front;//若大于255,则返回
}
for(int i = ; i < ; i++){
int Paris_x = front.x1 + _move[i][];//走一步
int Paris_y = front.y1 + _move[i][];
if( <= Paris_x && Paris_x < n && <= Paris_y && Paris_y < m &&
_map[Paris_x][Paris_y] != '#' && _map[Paris_x][Paris_y] != '!'){
int k = Helen_move[i]; int Helen_x = front.x2 + _move[k][];
int Helen_y = front.y2 + _move[k][]; if( <= Helen_x && Helen_x < n && <= Helen_y && Helen_y < m){
if(_map[Helen_x][Helen_y] == '#'){//撞墙则不走
Helen_x = front.x2;
Helen_y = front.y2;
}
else if(_map[Helen_x][Helen_y] == '!') continue;//遇到熔浆 if(visit[Paris_x][Paris_y][Helen_x][Helen_y] == ) continue;
Node tmp = front;
tmp.x1 = Paris_x;
tmp.y1 = Paris_y;
tmp.x2 = Helen_x;
tmp.y2 = Helen_y;
tmp.path[tmp.step] = i;
tmp.step = front.step + ;
q.push(tmp);
visit[Paris_x][Paris_y][Helen_x][Helen_y] = ;
if(Paris_x == Helen_x && Paris_y == Helen_y){//直接相遇
return tmp;
}
if(Paris_x == front.x2 && Paris_y == front.y2 &&
Helen_x == front.x1 && Helen_y == front.y1){
return tmp;//交差相遇
}
} }
}
}
front.step = ;
return front;
}
int main(){
cin >> n >> m; int x1, y1;
int x2, y2;
memset(visit, , sizeof(visit));
memset(Helen_move, , sizeof(Helen_move));
for(int i = ; i < n; i++){
for(int j = ; j < m; j++){
cin >> _map[i][j];
if(_map[i][j] == 'P'){//Paris的位置
x1 = i;
y1 = j;
}
if(_map[i][j] == 'H'){//Helen的位置
x2 = i;
y2 = j;
}
}
} for(int i = ; i < ; i++){
char c;
cin >> c;
if(c == 'N')Helen_move[i] = ;//Paris走时Helen的方向
else if(c == 'S')Helen_move[i] = ;
else if(c == 'W')Helen_move[i] = ;
else if(c == 'E')Helen_move[i] = ;
}
Node tmp = bfs(x1, y1, x2, y2, n, m);
if(tmp.step > ) cout << "Impossible" << endl;
else{
cout << tmp.step << endl;
} } /*
5 5
#####
#P#.#
#H!.#
#.#.#
#####
WNSE
*/

Sicily 1215: 脱离地牢(BFS)的更多相关文章

  1. sicily 1215. 脱离地牢

    Description 在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活.他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想得到这两块石头了,只要把 ...

  2. 20180610模拟赛T1——脱离地牢

    Description 在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活.他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想着得到这两块石头了,只要 ...

  3. Sicily 1048: Inverso(BFS)

    题意是给出一个3*3的黑白网格,每点击其中一格就会使某些格子的颜色发生转变,求达到目标状态网格的操作.可用BFS搜索解答,用vector储存每次的操作 #include<bits/stdc++. ...

  4. sicily 题目分类

    为了方便刷题,直接把分类保存下来方便来找. 转自:http://dengbaoleng.iteye.com/blog/1505083 [数据结构/图论] 1310Right-HeavyTree笛卡尔树 ...

  5. 地牢逃脱 (BFS)

    题意:给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指 ...

  6. 2019 校内赛 RPG的地牢猎手(bfs+优先队列)

    Problem Description Luke最近沉迷一款RPG游戏,游戏中角色可以进入地牢关卡,只要顺利走出地牢就可以获得奖励.地牢表示为n行m列的块矩阵,其中每个块只可以是障碍块.入口.出口或数 ...

  7. BFS简单题套路_Codevs 1215 迷宫

    BFS 简单题套路 1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明 ; struct Status { int r, c; Status(, ) : r(r), c(c) {} // ...

  8. Sicily 1444: Prime Path(BFS)

    题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ...

  9. Sicily 1051: 魔板(BFS+排重)

    相对1150题来说,这道题的N可能超过10,所以需要进行排重,即相同状态的魔板不要重复压倒队列里,这里我用map储存操作过的状态,也可以用康托编码来储存状态,这样时间缩短为0.03秒.关于康托展开可以 ...

随机推荐

  1. C#创建Excel(.xls和.xlsx)文件的三种方法

    生成EXCEL文件是经常需要用到的功能,我们利用一些开源库可以很容易实现这个功能. 方法一:利用excellibrary,http://code.google.com/p/excellibrary/ ...

  2. IT培训行业揭秘(四)

    IT培训班的老师前面已经说过,很多都是从一线程序员岗位转过来的,因为培训行业的收入整体上来看还是比作普通程序员要高一些,这是市场的普遍行情.还有一部分老师从培训班学习过并且留到培训班任教的.一般这种老 ...

  3. Docker的安装

    目前Docker可以在Linux系统.Windows系统,这个文档介绍3种安装方式,安装Docker版本为1.8.2 具备安装Docker的条件: 64位CPU架构的设备 Linux系统内核推荐3.1 ...

  4. Backbone.js应用基础

    前言: Backbone.js是一款JavaScript MVC应用框架,强制依赖于一个实用型js库underscore.js,非强制依赖于jquery:其主要组件有模型,视图,集合,路由:与后台的交 ...

  5. UDP通信

    package com.slp; import java.io.IOException; import java.net.DatagramPacket; import java.net.Datagra ...

  6. mysql函数大全

    对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. mysql& ...

  7. ActiveMQ入门实例Demo

    前面我们已经搭建和配置好了ActiveMQ,下面来看一个Demo,体验一下MQ. JMS 消息模型 JMS消息服务应用程序结构支持两种模型:点对点模型,发布者/订阅者模型. (1)点对点模型(Queu ...

  8. 【USACO 3.3】Riding The Fences(欧拉路径)

    题意: 给你每个fence连接的两个点的编号,输出编号序列的字典序最小的路径,满足每个fence必须走且最多走一次. 题解: 本题就是输出欧拉路径. 题目保证给出的图是一定存在欧拉路径,因此找到最小的 ...

  9. C#委托与事件

    一.在控制台下使用委托和事件 我们都知道,C#中有"接口"这个概念,所谓的"接口"就是定义一套标准,然后由实现类来具体实现其中的方法,所以说"接口,是 ...

  10. js导出excel

    function inportEx() { $("#btnEx").text("导出中..."); var fugNumber = "";/ ...