BFS求优化(TLE)
查看原帖
BFS求优化(TLE)
798157
emo_male_god楼主2023/5/29 20:20

我 #3 和 #10 两个超大数据毒瘤点 TLETLE 了,我觉得能优化的都优化了。代码大致思路:给 BFSBFS 函数起点和终点,aa 数组存地图,bb 数组判重,x_init 和 y_init 表示贝西的起点,x_knight 和 y_knight 表骑士的位置。

代码如下

#include <iostream>
#include <cstring>
#include <queue>

using namespace std;

const int dx[] = {0, -1, 1, 0, 0}, dy[] = {0, 0, 0, -1, 1}, N = 1010;
int w, h, a[N][N], x_init, y_init, x_knight, y_knight, ans = 114514;
vector<pair<int, int>> v;
struct node
{
	int x, y, step;
};

bool b[N][N];

int bfs(int initx, int inity, int endx, int endy)
{
	memset(b, 0, sizeof b);
	
	queue<node> q;
	q.push({initx, inity, 0});
	b[initx][inity] = 1;
	while (!q.empty())
	{
		int x = q.front().x, y = q.front().y, step = q.front().step;
		q.pop();
		if (x == endx && y == endy) return step;
		
		if (step >= ans) return -1;
		
		for (int i = 1; i <= 4; i ++ )
		{
			int _x = x + dx[i], _y = y + dy[i], _step = step + 1;
			if (_x == endx && _y == endy) return _step;
			if (b[_x][_y] == 0 && (a[_x][_y] == 0 || a[_x][_y] == 2) && _x >= 1 && _x <= h && _y >= 1 && _y <= w)
			{
				b[_x][_y] = 1;
				q.push({_x, _y, _step});
			}
		}
	}
	return -1;
}

int main()
{
	scanf("%d%d", &w, &h);
	for (int i = 1; i <= h; i ++ )
	{
		for (int j = 1; j <= w; j ++ )
		{
			scanf("%d", &a[i][j]);
			if (a[i][j] == 4)
			{
				v.push_back({i, j});
			}
			else if (a[i][j] == 2)
			{
				x_init = i, y_init = j;
			}
			else if (a[i][j] == 3)
			{
				x_knight = i, y_knight = j;
			}
		}
	}
	
	int size_v = v.size();
	for (int i = 0; i <= size_v; i ++ )
	{
		int temp1 = bfs(x_init, y_init, v[i].first, v[i].second);
		if (temp1 != -1)
		{
			int temp2 = bfs(v[i].first, v[i].second, x_knight, y_knight);
			if (temp2 != -1)
			{
				ans = min(ans, temp1 + temp2);
			}
		}
//		int temp1 = bfs(x_init, y_init, v[i].first, v[i].second);
//		int temp2 = bfs(v[i].first, v[i].second, x_knight, y_knight);
//		if (temp1 != -1 && temp2 != -1) ans = min(ans, temp1 + temp2);
	}
	printf("%d\n", ans);
	return 0;
}
2023/5/29 20:20
加载中...