I'm stuck!
 
问题描述
  给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:   '#': 任何时候玩家都不能移动到此方格;   '+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;   '-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格;   '|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格;   '.': 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为'#',则玩家不能再移动;   'S': 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;   'T': 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格。   此外,玩家不能移动出地图。   请找出满足下面两个性质的方格个数:   1. 玩家可以从初始位置移动到此方格;   2. 玩家不可以从此方格移动到目标位置。
输入格式
  输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。   接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个'S'和一个'T'。
输出格式
  如果玩家在初始位置就已经不能到达终点了,就输出“I'm stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。
样例输入
5 5
--+-+
..|#.
..|##
S-+-T
####.
样例输出
2
 
思路:广度优先搜索//从初始位置开始和从终点两个位置位起点,找出从起点可以到达而从终点不能到达的点
 
代码如下:
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <stdio.h>
#include <queue>
#define maxn 60
char mmap[maxn][maxn];
int vis[maxn][maxn]; //标记从起点出发
int vis1[maxn][maxn]; //标记从终点出发
int dy[4] = {0, 0, -1, 1}; //转向数组
int dx[4] = {1, -1, 0, 0};
int n, m;
int num[maxn][maxn][maxn][maxn];//记录一些路径
using namespace std;
struct Node//定义结构体
{
int x;
int y;
Node() {}
Node(int _x, int _y) {
x = _x;
y = _y;
}
} node[maxn];
Node st, ed;
int check(Node a)//节点是否合法
{
if(a.x >= 0 && a.x < n && a.y >= 0 && a.y < m && mmap[a.x][a.y] !='#') {
return 1;
}
return 0;
}
int get(char c, int& u, int& v)//判断当前可以走的方向
{
if(c == '-')
{
u = 2;
v = 4;
}
else if(c == '|')
{
u = 0;
v = 2;
}
else if(c == '.')
{
u = 0;
v = 1;
}
else
{
u = 0;
v = 4;
}
}
queue<Node>que;
int bfs()
{
while(!que.empty()) {
que.pop();
}
que.push(st); //从起点走
vis[st.x][st.y] = 1;
Node tmp, now;
while(!que.empty())
{
tmp = que.front();
que.pop();
int u, v;
get(mmap[tmp.x][tmp.y], u, v);
for(int i = u; i < v; i++)
{
now.x = tmp.x + dx[i];
now.y = tmp.y + dy[i];
if(check(now))
{
num[tmp.x][tmp.y][now.x][now.y] = 1;
if(!vis[now.x][now.y]) {
vis[now.x][now.y] = 1;
que.push(now);
}
}
}
}
if(vis[ed.x][ed.y] == 0)
{
puts("I'm stuck!");// 若未到达
return 0;
}
que.push(ed); //从终点走
while(!que.empty())
{
tmp = que.front();
que.pop();
for(int i = 0; i < 4; i++)
{
now.x = tmp.x + dx[i];
now.y = tmp.y + dy[i];
if(check(now) && vis1[now.x][now.y] == 0 && num[now.x][now.y][tmp.x][tmp.y])
{
vis1[now.x][now.y] = 1;
que.push(now);
}
}
}
int ans = 0;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(vis[i][j] == 1 && vis1[i][j] == 0)
{
ans++;
}
}
}
printf("%d\n", ans);
return 0;
}
int main()
{
scanf("%d %d", &n, &m);
memset(vis, 0, sizeof(vis));
memset(vis1, 0, sizeof(vis1));
memset(num, 0, sizeof(num));
for(int i = 0; i < n; i++)
{
scanf("%s", mmap[i]);
for(int j = 0; j < m; j++)
{
if(mmap[i][j] == 'S')
{
st.x = i;
st.y = j;
}
if(mmap[i][j] == 'T')
{
ed.x = i;
ed.y = j;
}
}
}
bfs();
return 0;
}

CCF-I'm stuck!(BFS)的更多相关文章

  1. CCF I'm Stuck!

    问题描述 试题编号: 201312-5 试题名称: I'm stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', ...

  2. CCF 201312-5 I’m stuck! (暴力,BFS)

    问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此方格 ...

  3. I’m stuck!(BFS)

    I’m stuck! 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能 ...

  4. CCF模拟 I’m stuck!

    I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB   问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七 ...

  5. CCF系列之I’m stuck!(201312-5)

    试题名称: I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', ...

  6. CCF - CCSP 2018-01 绝地求生 BFS

    BFS从安全地区方向搞一下就好了 1.还是注意每回合清空 2.posx居然开小了,可不能犯这种错误 3.地图用a和节点的dis重名了,建议其他变量禁止用a命名 4.在输入数据之前continue了,这 ...

  7. CCF 最优配餐 (BFS)

    问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题. 栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的 ...

  8. Robots on a grid(DP+bfs())

    链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=25585 Current Server Time: 2013-08-27 20:42:26 Ro ...

  9. I’m stuck!

    I’m stuck! 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候 ...

随机推荐

  1. log4j2文件结构

    标签结构 Configuration properties Appenders Console PatternLayout File RollingRandomAccessFile Filters T ...

  2. 原生js的一些盲点

    1.document.readyState 有三个值loading  interactive //loading 仍在加载 interactive  文档已被解析 正在加载状态结束 但是样式表和框架之 ...

  3. PO,BO,VO,DTO,POJO,DAO,DO是什么?

    PO (Persistent Object)   持久化对象,表示实体数据.BO (Business Object)        业务对象,主要是把逻辑业务封装为一个对象 .VO (Value/Vi ...

  4. 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写

    摘要:本文将系统介绍在GaussDB(DWS)系统中影响性能的坏味道SQL及SQL模式,帮助大家能够从原理层面尽快识别这些坏味道SQL,在调优过程中及时发现问题,进行整改. 数据库的应用中,充斥着坏味 ...

  5. netty核心组件之channel、handler、ChannelHandlerContext、pipeline

    channel介绍: netty中channel分为NioServerScoketChannel和NioSocketChannel,分别对应java nio中的ServerScoketChannel和 ...

  6. 巧用 Lazy 解决.NET Core中的循环依赖关系

    原文作者: Thomas Levesque 原文链接:https://thomaslevesque.com/2020/03/18/lazily-resolving-services-to-fix-ci ...

  7. Dubbo 就是靠它崭露头角!(身为开源框架很重要的一点)

    Hola,我是 yes. 经过了 RPC 核心和 Dubbo 微内核两篇文章后,今天终于要稍稍深入一波 Dubbo 了. 作为一个通用的 RPC 框架,性能是很重要的一环,而易用性和扩展性也极为重要. ...

  8. .NET的并发编程(TPL编程)是什么?

    写在前面 优秀软件的一个关键特征就是具有并发性.过去的几十年,我们可以进行并发编程,但是难度很大.以前,并发性软件的编写.调试和维护都很难,这导致很多开发人员为图省事放弃了并发编程.新版 .NET 中 ...

  9. Spring Cloud Gateway 跨域 CORS 配置方式实现

    网上找了一堆文章全是说这样写无效 globalcors: cors-configurations: '[/**]': allowCredentials: true allowedOriginPatte ...

  10. Python使用Protobuf&&如何赋值&&如何正反序列化

    前言 使用protobuf主要是两个步骤,序列化和反序列化. 关于Proto有哪些数据类型,然后如何编写,此处就不赘述了,百度一下有很多. 此文主要是总结,python使用protobuf的过程,如何 ...