给定一个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. int,long,long long类型的范围

    [内置类型] int      -2147483648-2147483647  //现在编译器的int型是32位的,以前为16位的范围是-32768~32767 unsigned  int   0-4 ...

  2. 利用java中的BigInteger实现进制转换

    [原创] java中的进制BigInteger十分的强大,而且好用,他可以表示任意大的整数,同时还可以进行进制转换,十分的方便, 代码示例: package com.jiajia.demo_1; im ...

  3. Jquery 跨域请求JSON数据问题

    制作网站时,我们有时候为了方便快捷会调用别人写好的API接口,或者是调用一些免费的API接口获得JSON数据.比如天气,农历,网站备案信息查询等. 但是,这些API接口都是别人自己服务器上的,我们要调 ...

  4. js定时器实现图片轮播

    效果展示如下: setInterval(moverleft,3000);定时器设置为3秒,而且实现图片下方的小圆点序号跟图片对应,点击小圆点也能切换图片. 代码如下: <!DOCTYPE htm ...

  5. C - 最长公共子序列

    C - 最长公共子序列 Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem De ...

  6. Bjarne Stroustrup 语录1

    1. 请谈谈C++书.  没有,也不可能有一本书对于所有人来说都是最好的.不过对于那些真正的程序员来说,如果他喜欢从“经典风格”的书中间学习一些新的概念和技术,我推荐我的The C++ Program ...

  7. [洛谷P2590][ZJOI2008]树的统计

    题目大意:一棵树,支持三个操作, $CHANGE\;u\;t:$ 把结点$u$的权值改为$t$ $QMAX\;u\;v:$ 询问从点$u$到点$v$的路径上的节点的最大权值 $QSUM\;u\;v:$ ...

  8. 01、BUCK电路的参数计算

    案例:设计一个Buck电路,满足如下性能指标要求:一.性能指标要求  1.输入电压  2.输出电压  3.输出电压纹波  4.电流纹波  5.开关频率  二.需要计算的参数  三.BUCK电路拓扑   ...

  9. SCU3037 Painting the Balls

    Description Petya puts the \(N\) white balls in a line and now he wants to paint some of them in bla ...

  10. bzoj2724: [Violet 6]蒲公英 分块 区间众数 论algorithm与vector的正确打开方式

    这个,要处理各个数的话得先离散,我用的桶. 我们先把每个块里的和每个块区间的众数找出来,那么在查询的时候,可能成为[l,r]区间的众数的数只有中间区间的众数和两边的数. 证明:若不是这里的数连区间的众 ...