萌新求助广搜入门
查看原帖
萌新求助广搜入门
328170
Kalium楼主2021/12/5 22:59
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>

using namespace std;

int dx[4] = {1, -1, 0, 0};

int dy[4] = {0, 0, 1, -1};

int n, m;

char s[37][37];

int mxs, mys, gxs, gys, xf, yf;

int ans = -1;

struct node {
	int mx, my, gx, gy, step;
};

bool flag[37][37][37][37];

queue <node> q;	

inline bool exist(int x, int y) {
	return x >= 1 && x <= n && y >= 1 && y <= m && s[x][y] != 'X'; 
} 

inline bool check(int mx, int my, int gx, int gy) {
	return mx == xf && my == yf && gx == xf && gy == yf;
}

inline bool work(int mx, int my, int gx, int gy, int umx, int umy, int ugx, int ugy, int step) {
	//cout << mx << " " << my << " " << gx << " " << gy << " " << step << endl;
	
	if (s[mx][my] == '#') mx = umx, my = umy; 
	if (s[gx][gy] == '#') gx = ugx, gy = ugy;
	
	if (exist(mx, my) && exist(gx, gy) && ! flag[mx][my][gx][gy]) {
		flag[mx][my][gx][gy] = 1;
		ans = step + 1;
		q.push((node) {mx, my, gx, gy, ans});
		
		if (check(mx, my, gx, gy)) return 1;
	}
	
	return 0;
}

inline void bfs() {
	q.push((node) {mxs, mys, gxs, gys, 0});
	
	while (! q.empty()) {
		node u = q.front();
		
		q.pop();
		
		int mnx, mny, gnx, gny;
		
		mnx = u.mx + dx[0];//上 
		mny = u.my + dy[0];
		gnx = u.gx + dx[0];
		gny = u.gy + dy[0];
		
		if (work(mnx, mny, gnx, gny, u.mx, u.my, u.gx, u.gy, u.step)) return ;
		
		mnx = u.mx + dx[1];//下 
		mny = u.my + dy[1];
		gnx = u.gx + dx[1];
		gny = u.gy + dy[1];
		
		if (work(mnx, mny, gnx, gny, u.mx, u.my, u.gx, u.gy, u.step)) return ;
		
		mnx = u.mx + dx[2];//右 
		mny = u.my + dy[2];
		gnx = u.gx + dx[3];
		gny = u.gy + dy[3];
		
		if (work(mnx, mny, gnx, gny, u.mx, u.my, u.gx, u.gy, u.step)) return ;
		
		mnx = u.mx + dx[3];//左 
		mny = u.my + dy[3];
		gnx = u.gx + dx[2];
		gny = u.gy + dy[2];
		
		if (work(mnx, mny, gnx, gny, u.mx, u.my, u.gx, u.gy, u.step)) return ;
	}
}

int main() {
	scanf("%d %d", &n, &m);
	
	for (int i = 1; i <= n; i ++) {
		scanf("%s", s[i] + 1);
		
		for (int j = 1; j <= m; j ++) {
			if (s[i][j] == 'M') mxs = i, mys = j;
			if (s[i][j] == 'G') gxs = i, gys = j;
			if (s[i][j] == 'T') xf = i, yf = j;
		}
	}
	
	bfs();
	
	if (ans == -1)
		printf("no\n");
	else
		printf("%d\n", ans);
	
	return 0;
}

90pts,WA#1,和第一篇题解对照感觉没啥问题了

2021/12/5 22:59
加载中...