用的方法比较抽象,对于每一个药都跑一遍BFS,看是不是能到其他的药,然后对于所有药再跑一遍Floyd。
#include <bits/stdc++.h>
#define ll long long
#define db double
#define ull unsigned long long
#define inf INT_MAX
#define linf LLONG_MAX
#define ninf INT_MIN
#define nlinf LLONG_MIN
//#define mod
//#define range
using namespace std;
int n, m, k, mx[300], my[300], f[302][302], dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1}, stx, sty, edx, edy;
struct point{
int x, y, dis, med;
bool wall;
bool check(){
return x >= 0 && x < n && y >= 0 && y < m && !wall;
}
}c[200][200], now, t;
void reset(){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
c[i][j].dis = -1;
}
}
return;
}
void bfs(int sx, int sy){
queue<point> q;
reset();
c[sx][sy].dis = 0;
q.push(c[sx][sy]);
while(!q.empty()){
now = q.front();
q.pop();
for(int i = 0; i < 4; i++){
t = c[now.x + dx[i]][now.y + dy[i]];
if(t.dis == -1 && t.check()){
c[now.x + dx[i]][now.y + dy[i]].dis = now.dis + 1;
q.push(c[now.x + dx[i]][now.y + dy[i]]);
}
}
}
return;
}
//如果再忘记把题目给的1~n变为0~n-1自罚20仰卧起坐
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
char ch;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> ch;
c[i][j].x = i;
c[i][j].y = j;
c[i][j].wall = (ch == '#');
if(ch == 'S'){
stx = i;
sty = j;
}
if(ch == 'T'){
edx = i;
edy = j;
}
}
}
cin >> k;
for(int i = 1; i <= k; i++){
int t;
cin >> mx[i] >> my[i] >> t;
mx[i]--;
my[i]--;
c[mx[i]][my[i]].med = t;
}
mx[0] = stx;
my[0] = sty;
mx[k + 1] = edx;
my[k + 1] = edy;
if(!c[stx][sty].med){
cout << "No" << endl;
return 0;
}
for(int i = 0; i <= k + 1; i++){
bfs(mx[i], my[i]);
for(int j = 0; j <= k + 1; j++){
if(c[mx[j]][my[j]].dis != -1){
f[i][j] = 1;
}
}
}
for(int l = 0; l <= k + 1; l++){
for(int i = 0; i <= k + 1; i++){
for(int j = 0; j <= k + 1; j++){
if(f[i][l] + f[l][j] < f[i][j]){
f[i][j] = f[i][l] + f[l][j];
}
}
}
}
if(f[0][k + 1]){
cout << "Yes" << endl;
}
else{
cout << "No" << endl;
}
return 0;
}