제출 #1343936

#제출 시각아이디문제언어결과실행 시간메모리
1343936jumpTracks in the Snow (BOI13_tracks)C++20
100 / 100
728 ms222688 KiB
#include <bits/stdc++.h>
#define int long long

int H, W;
std::vector<std::string> grid;
int dist[4010][4010];

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

signed main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);

	std::cin >> H >> W;
	grid.resize(H+1);

	for(int i=1;i<=H;i++){
		std::string s;
		std::cin >> s;
		grid[i] = " " + s;
	}

	for(int i=1;i<=H;i++){
		for(int j=1;j<=W;j++){
			dist[i][j] = 1e9;
		}
	}

	std::deque<std::pair<int,int>> dq;

	dist[1][1] = 0;
	dq.push_front({1,1});

	while(!dq.empty()){
		auto [x,y] = dq.front();
		dq.pop_front();

		for(int d=0;d<4;d++){
			int nx = x + dx[d];
			int ny = y + dy[d];

			if(nx<1 || ny<1 || nx>H || ny>W) continue;
			if(grid[nx][ny] == '.') continue;

			int cost = (grid[nx][ny] != grid[x][y]);

			if(dist[nx][ny] > dist[x][y] + cost){
				dist[nx][ny] = dist[x][y] + cost;
				if(cost == 0) dq.push_front({nx,ny});
				else dq.push_back({nx,ny});
			}
		}
	}

	int ans = 0;
	for(int i=1;i<=H;i++){
		for(int j=1;j<=W;j++){
			if(grid[i][j] != '.'){
				ans = std::max(ans, dist[i][j]);
			}
		}
	}

	std::cout << ans + 1 << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...