這就是一個搜索題,DFS和BFS均可。需注意搜索的時間複雜度爲,最多每個有4個搜索方向。故而計算量達到,稍不留神就超時了。所以需要寫程序的時候進行一些優化,比如存放各個字符對應哪些搜索方向就不要採用判斷或者map存放,會導致最後一個點超時。
#include <iostream>
#include <map>
#include <queue>
#include <cstring>
using namespace std;
char g[55][55];
int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, 1, -1};
vector<int> mp[128];
int m, n, vis[55][55], ss[55][55];
void bfs(int i, int j)
{
memset(vis, 0, sizeof(vis));
queue<pair<int, int>> q;
q.push({i, j});
while(!q.empty())
{
int x = q.front().first, y = q.front().second;
q.pop();
vis[x][y] = 1;
vector<int> d = mp[g[x][y]];
for(auto k: d)
{
int nx = x + dx[k], ny = y + dy[k];
if(nx<0 || nx>=m || ny<0 || ny>=n || vis[nx][ny]==1) continue;
if(g[nx][ny] == '#') continue;
q.push({nx, ny});
vis[nx][ny] = 1;
}
}
}
void Sbfs(int i, int j)
{
memset(ss, 0, sizeof(ss));
queue<pair<int, int>> q;
q.push({i, j});
while(!q.empty())
{
int x = q.front().first, y = q.front().second;
q.pop();
ss[x][y] = 1;
vector<int> d = mp[g[x][y]];
for(auto k: d)
{
int nx = x + dx[k], ny = y + dy[k];
if(nx<0 || nx>=m || ny<0 || ny>=n || ss[nx][ny]==1) continue;
if(g[nx][ny] == '#') continue;
q.push({nx, ny});
ss[nx][ny] = 1;
}
}
}
int main()
{
mp['+'] = {0, 1, 2, 3}, mp['|'] = {0, 1}, mp['-'] = {2, 3}, mp['.'] = {1};
mp['S'] = {0, 1, 2, 3}, mp['T'] = {0, 1, 2, 3};
cin >> m >> n;
int sx, sy, tx, ty;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
{
cin >> g[i][j];
if(g[i][j] == 'S') sx=i, sy=j;
if(g[i][j] == 'T') tx=i, ty=j;
}
Sbfs(sx, sy); // 遍歷從S能走到的所有地方,用ss數組記錄
if(ss[tx][ty] == 0)
{
cout << "I'm stuck!" << endl;
return 0;
}
int res = 0;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
{
if(g[i][j]=='S' || g[i][j]=='T' || g[i][j]=='#') continue;
bfs(i, j);
if(vis[tx][ty]==0 && ss[i][j]==1) ++res;
}
cout << res << endl;
return 0;
}