I’m stuck!
2016-07-04 23:33
162 查看
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
样例说明
如果把满足性质的方格在地图上用'X'标记出来的话,地图如下所示:
--+-+
..|#X
..|##
S-+-T
####X
从S开始搜索,把能到达到的点标记一下,再从T开始搜索,把能到达到的点标记一下,统计从S出发能到达但从T出发不能到达的点的个数。
给定一个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
从S开始搜索,把能到达到的点标记一下,再从T开始搜索,把能到达到的点标记一下,统计从S出发能到达但从T出发不能到达的点的个数。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> #define INF 1e9 #define MOD 1000000007 using namespace std; typedef long long ll; struct Node{ Node(int a, int b){ x = a; y = b; } int x, y; }; char vis[55][55]; int s1[55][55], s2[55][55], r, c, k1, k2, p1, p2; int dir[4][2] = {-1, 0, 1, 0, 0, 1, 0, -1}; void bfs1(){ queue<Node> q; q.push(Node(k1, k2)); s1[k1][k2] = 1; while(!q.empty()){ Node e = q.front(); q.pop(); for(int i = 0; i < 4; i++){ if(vis[e.x][e.y] == '.'){ if(i != 1) continue; } else if(vis[e.x][e.y] == '|'){ if(i != 0 && i != 1) continue; } else if(vis[e.x][e.y] == '-'){ if(i != 2 && i != 3) continue; } int x = dir[i][0] + e.x; int y = dir[i][1] + e.y; if(x >= 1 && x <= r && y >= 1 && y <= c && vis[x][y] != '#' && s1[x][y] == 0){ s1[x][y] = 1; q.push(Node(x, y)); } } } } void bfs2(){ queue<Node> q; q.push(Node(p1, p2)); s2[p1][p2] = 1; while(!q.empty()){ Node e = q.front(); q.pop(); for(int i = 0; i < 4; i++){ int x = e.x + dir[i][0]; int y = e.y + dir[i][1]; if(x >= 1 && x <= r && y >= 1 && y <= c && vis[x][y] != '#' && s2[x][y] == 0){ if(vis[x][y] == '.'){ if(i != 0) continue; } else if(vis[x][y] == '|'){ if(i != 0 && i != 1) continue; } else if(vis[x][y] == '-'){ if(i != 2 && i != 3) continue; } s2[x][y] = 1; q.push(Node(x, y)); } } } } int main(){ // freopen("in.txt", "r", stdin); scanf("%d%d ", &r, &c); for(int i = 1; i <= r; i++){ for(int j = 1; j <= c; j++){ scanf("%c", &vis[i][j]); if(vis[i][j] == 'S'){ vis[i][j] = '+'; k1 = i; k2 = j; } else if(vis[i][j] == 'T'){ vis[i][j] = '+'; p1 = i; p2 = j; } } getchar(); } bfs1(); bfs2(); if(s1[p1][p2] == 0){ puts("I'm stuck!"); return 0; } int ans = 0; for(int i = 1; i <= r; i++){ for(int j = 1; j <= c; j++) if(s1[i][j] && !s2[i][j]) ans++; } printf("%d\n", ans); return 0; }
相关文章推荐
- SPI 驱动分析
- 如何使用Python在Kaggle竞赛中成为Top15
- 10步创建一个Laravel 5 package(翻译)
- logstash-input-jdbc实现oracle 与elasticsearch实时同步详解
- leetcode题解日练--2016.7.4
- xiaoxiaosu,你需要掌握的东西
- js设计模式之单例模式
- KindEditor + Jsp 使用总结
- android view
- 青春不要荒废,一起Fly!
- sqlite错误处理:library routine called out of sequence
- adb 安装 apk bat脚本,支持多设备
- 这 10 篇安卓热文,你别错过哦
- Android项目实战(二十):浅谈ListView悬浮头部展现效果
- Tomcat环境配置
- LeetCode 69
- 第24章 行为型模式—模板方法模式
- MySQL查询计划输出列的含义
- 安卓框架
- Spring与CXF整合