给定一个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
样例说明

如果把满足性质的方格在地图上用'X'标记出来的话,地图如下所示:

--+-+

..|#X

..|##

S-+-T

####X

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string.h>
  4. #include <cmath>
  5. #include <stdio.h>
  6. #include <queue>
  7. #define maxn 60
  8. char mmap[maxn][maxn];
  9. int vis[maxn][maxn];
  10. int vis1[maxn][maxn];
  11. int dy[] = {, , -, };
  12. int dx[] = {, -, , };
  13. int n, m;
  14. int num[maxn][maxn][maxn][maxn];
  15. using namespace std;
  16. struct Node
  17. {
  18. int x;
  19. int y;
  20. Node() {}
  21. Node(int _x, int _y) {
  22. x = _x;
  23. y = _y;
  24. }
  25. } node[maxn];
  26. Node st, ed;
  27. int check(Node a)
  28. {
  29. if(a.x >= && a.x < n && a.y >= && a.y < m && mmap[a.x][a.y] != '#') {
  30. return ;
  31. }
  32. return ;
  33. }
  34. int get(char c, int& u, int& v)
  35. {
  36. if(c == '-')
  37. {
  38. u = ;
  39. v = ;
  40. }
  41. else if(c == '|')
  42. {
  43. u = ;
  44. v = ;
  45. }
  46. else if(c == '.')
  47. {
  48. u = ;
  49. v = ;
  50. }
  51. else
  52. {
  53. u = ;
  54. v = ;
  55. }
  56. }
  57. queue<Node>que;
  58. int bfs()
  59. {
  60. while(!que.empty()) {
  61. que.pop();
  62. }
  63. que.push(st);
  64. vis[st.x][st.y] = ;
  65. Node tmp, now;
  66. while(!que.empty())
  67. {
  68. tmp = que.front();
  69. que.pop();
  70. int u, v;
  71. get(mmap[tmp.x][tmp.y], u, v);
  72. for(int i = u; i < v; i++)
  73. {
  74. now.x = tmp.x + dx[i];
  75. now.y = tmp.y + dy[i];
  76. if(check(now))
  77. {
  78. num[tmp.x][tmp.y][now.x][now.y] = ;
  79. if(!vis[now.x][now.y]) {
  80. vis[now.x][now.y] = ;
  81. que.push(now);
  82. }
  83. }
  84. }
  85. }
  86. if(vis[ed.x][ed.y] == )
  87. {
  88. puts("I'm stuck!");
  89. return ;
  90. }
  91. que.push(ed);
  92. while(!que.empty())
  93. {
  94. tmp = que.front();
  95. que.pop();
  96. for(int i = ; i < ; i++)
  97. {
  98. now.x = tmp.x + dx[i];
  99. now.y = tmp.y + dy[i];
  100. if(check(now) && vis1[now.x][now.y] == && num[now.x][now.y][tmp.x][tmp.y])
  101. {
  102. vis1[now.x][now.y] = ;
  103. que.push(now);
  104. }
  105. }
  106. }
  107. int ans = ;
  108. for(int i = ; i < n; i++)
  109. {
  110. for(int j = ; j < m; j++)
  111. {
  112. if(vis[i][j] == && vis1[i][j] == )
  113. {
  114. ans++;
  115. }
  116. }
  117. }
  118. printf("%d\n", ans);
  119. return ;
  120. }
  121. int main()
  122. {
  123. scanf("%d %d", &n, &m);
  124. memset(vis, , sizeof(vis));
  125. memset(vis1, , sizeof(vis1));
  126. memset(num, , sizeof(num));
  127. for(int i = ; i < n; i++)
  128. {
  129. scanf("%s", mmap[i]);
  130. for(int j = ; j < m; j++)
  131. {
  132. if(mmap[i][j] == 'S')
  133. {
  134. st.x = i;
  135. st.y = j;
  136. }
  137. if(mmap[i][j] == 'T')
  138. {
  139. ed.x = i;
  140. ed.y = j;
  141. }
  142. }
  143. }
  144. bfs();
  145. return ;
  146. }

ccf-I’m stuck!的更多相关文章

  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. CCF系列之I’m stuck!(201312-5)

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

  4. CCF模拟 I’m stuck!

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

  5. CCF计算机职业资格认证考试题解

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF计算机职业资格认证考试题解 CCF计算机软件能力认证(简称CCF CSP认证)是CCF计算机职业资格认证系 ...

  6. CCF认证历年试题

    CCF认证历年试题 不加索引整理会死星人orz 第一题: CCF201712-1 最小差值(100分) CCF201709-1 打酱油(100分) CCF201703-1 分蛋糕(100分) CCF2 ...

  7. 【刷题笔记】I'm stuck! (迷宫)-----java方案

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

  8. CCF考试

    第八次CCF考试记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四题的代码 第 ...

  9. CCF 模拟E DFS深搜

    http://115.28.138.223:81/view.page?opid=5 这道题问的很怪. 起点DFS,每一个点还要DFS一次,统计不能到终点的个数 数据量不大这样做也能AC #includ ...

  10. CCF关于NOIP2014复赛报名的通知

    CCF关于NOIP2014复赛报名的通知   CCF NOIP2014复赛全部实行网上注册.报名.未通过网上报名的选手将不具备参赛和申诉资格. 系统注册须知: NOIP2014复赛注册时间:2014年 ...

随机推荐

  1. centos tomcat开机自启

    在 /etc/rc.local 下 输入tomcat bin目录下的startup.sh  /usr/tomcat8/bin/startup.sh 即可

  2. unity 归纳

    1.获取控件四个角在屏幕上的坐标 Vector3[] corners = new Vector3[]; gameObject.GetComponent<RectTransform>().G ...

  3. android仿QQ的SlideMenu

    这其实很简单就可以实现,只需要自定义一个View继承自HorizontalScrollView 1,新建一个项目,再新建一个MySlideMenu继承HorizontalScrollView publ ...

  4. sc"

    2.11 题目:二叉搜索树中的最近公共祖先 2.12 设计思路 if 树中不存在 u 或 v 错误 结束程序 定义 p 指向根节点 while true do: if p->key大于 u 和 ...

  5. Ext.net中TreePanel动态生成

    这个问题可以参考官网例子:http://examples2.ext.net/#/TreePanel/Basic/Built_in_CodeBehind/ 贴一段本人程序中用到的动态生成核心代码: Ex ...

  6. LevelDB速记

    LevelDb的基本结构如下: 由六大部分组成: 一.MemTable,用户写入和读取的直接对象, 二.Immutable MemTable,用户状态写入的对象写满的MemTable之后会转为Immu ...

  7. [Java文件操作] 将素数输出到文件

    [要求]编写程序求出10万以内的所有素数,并将这些素数输出到一个文本文件中,每行文本只包含一个素数数据. import java.util.*; import java.io.*; public cl ...

  8. javascript 随机数区间

    生成[0,max]之间的随机数 parseInt(Math.random()*(max+1),10);Math.floor(Math.random()*(max+1)); 生成[1,max]之间的随机 ...

  9. taotao用户注册前台页面

    注册页面效果: 注册jsp: <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  10. codeforces902B. Coloring a Tree

    B. Coloring a Tree 题目链接: https://codeforces.com/contest/902/problem/B 题意:给你一颗树,原先是没有颜色的,需要你给树填色成指定的样 ...