Submission #1280898

#TimeUsernameProblemLanguageResultExecution timeMemory
1280898m_a_dTracks in the Snow (BOI13_tracks)C++20
100 / 100
1289 ms208700 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define fi first
#define se second

int32_t main() {
	int n, m;
	cin >> n >> m;
	char grid[n][m];
	vector<vector<int>> distances(n, vector<int>(m, INT32_MAX));

	for (int i = 0; i < n; ++i)
		for (int j = 0; j < m; ++j)
			cin >> grid[i][j];

	vector<pair<int, int>> dirs = {{0,1}, {0,-1}, {1,0}, {-1,0}};
	distances[0][0] = 0;
	deque<pair<int, int>> que;
	que.push_front({0, 0});

	while (!que.empty()) {
		auto curr = que.front(); que.pop_front();
		for (auto& d : dirs) {
			int nx = curr.fi + d.fi;
			int ny = curr.se + d.se;
			if (nx >= 0 && nx < n && ny >= 0 && ny < m && grid[nx][ny]!='.') {
				int w = (grid[curr.fi][curr.se] == grid[nx][ny]) ? 0 : 1;
				if (distances[curr.fi][curr.se] + w < distances[nx][ny]) {
					distances[nx][ny] = distances[curr.fi][curr.se] + w;
					if (w == 1) que.push_back({nx, ny});
					else que.push_front({nx, ny});
				}
			}
		}
	}

	int max_d = 0;
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < m; ++j)
			if(grid[i][j]!='.') max_d = max(max_d, distances[i][j]);

	cout << max_d + 1 << '\n';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...