【赏2关】样例已过WA求调
查看原帖
【赏2关】样例已过WA求调
670355
Nuclear_Fish_cyq楼主2024/4/8 20:33

用的方法比较抽象,对于每一个药都跑一遍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;
}

2024/4/8 20:33
加载中...