제출 #730175

#제출 시각아이디문제언어결과실행 시간메모리
730175a_aguiloTracks in the Snow (BOI13_tracks)C++14
100 / 100
790 ms123184 KiB
#include<bits/stdc++.h>

using namespace std;

int H, W;
vector<string> snow;
vector<vector<int>> distances;

int bfs(){
	deque<int> DQ;
	distances[0][0] = 1;
	int ans = 1;
	DQ.push_back(0);
	while(!DQ.empty()){
		int actual = DQ.front(); DQ.pop_front();
		int x = actual/W;
		int y = actual - W*x;
		ans = max(ans, distances[x][y]);
		if(x){
			if(distances[x-1][y] == -1){
				if(snow[x-1][y] == snow[x][y]){
					distances[x-1][y] = distances[x][y];
					DQ.push_front((x-1)*W + y);
				}
				else if (snow[x-1][y] != '.'){
					distances[x-1][y] = distances[x][y]+1;
					DQ.push_back((x-1)*W + y);
				}
			}
		}
		if(y){
			if(distances[x][y-1] == -1){
				if(snow[x][y-1] == snow[x][y]){
					distances[x][y-1] = distances[x][y];
					DQ.push_front((x)*W + y-1);
				}
				else if (snow[x][y-1] != '.'){
					distances[x][y-1] = distances[x][y]+1;
					DQ.push_back((x)*W + y-1);
				}
			}
		}
		if(x < (H-1)){
			if(distances[x+1][y] == -1){
				if(snow[x+1][y] == snow[x][y]){
					distances[x+1][y] = distances[x][y];
					DQ.push_front((x+1)*W + y);
				}
				else if (snow[x+1][y] != '.'){
					distances[x+1][y] = distances[x][y]+1;
					DQ.push_back((x+1)*W + y);
				}
			}
		}
		if(y < (W-1)){
			if(distances[x][y+1] == -1){
				if(snow[x][y+1] == snow[x][y]){
					distances[x][y+1] = distances[x][y];
					DQ.push_front((x)*W + y + 1);
				}
				else if (snow[x][y+1] != '.'){
					distances[x][y+1] = distances[x][y]+1;
					DQ.push_back((x)*W + y + 1);
				}
			}
		}
	}
	return ans;
}

int main(){
	cin >> H >> W;
	snow = vector<string>(H);
	for(int i = 0; i < H; ++i)cin >> snow[i];
	distances = vector<vector<int>>(H, vector<int>(W, -1));
	cout << bfs()<< endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...