给定一个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
#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[] = {, , -, };
int dx[] = {, -, , };
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 >= && a.x < n && a.y >= && a.y < m && mmap[a.x][a.y] != '#') {
return ;
}
return ;
}
int get(char c, int& u, int& v)
{
if(c == '-')
{
u = ;
v = ;
}
else if(c == '|')
{
u = ;
v = ;
}
else if(c == '.')
{
u = ;
v = ;
}
else
{
u = ;
v = ;
}
}
queue<Node>que;
int bfs()
{
while(!que.empty()) {
que.pop();
}
que.push(st);
vis[st.x][st.y] = ;
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] = ;
if(!vis[now.x][now.y]) {
vis[now.x][now.y] = ;
que.push(now);
}
}
}
}
if(vis[ed.x][ed.y] == )
{
puts("I'm stuck!");
return ;
}
que.push(ed);
while(!que.empty())
{
tmp = que.front();
que.pop();
for(int i = ; i < ; i++)
{
now.x = tmp.x + dx[i];
now.y = tmp.y + dy[i];
if(check(now) && vis1[now.x][now.y] == && num[now.x][now.y][tmp.x][tmp.y])
{
vis1[now.x][now.y] = ;
que.push(now);
}
}
}
int ans = ;
for(int i = ; i < n; i++)
{
for(int j = ; j < m; j++)
{
if(vis[i][j] == && vis1[i][j] == )
{
ans++;
}
}
}
printf("%d\n", ans);
return ;
}
int main()
{
scanf("%d %d", &n, &m);
memset(vis, , sizeof(vis));
memset(vis1, , sizeof(vis1));
memset(num, , sizeof(num));
for(int i = ; i < n; i++)
{
scanf("%s", mmap[i]);
for(int j = ; 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 ;
}