Boj1981_배열에서 이동

Published: by Creative Commons Licence

  • 문제를 보고 해결 방법을 떠올리지 못하였고, 문제 분류를 보고도 떠올리지 못하였다.ㅠㅠ
  • 기본 bfs => 시간 초과
  • 배열의 각 수가 0~200 임을 알고 이분탐색과 bfs를 이용한다.
    • 최고 큰수, 작은수 저장하여 반토막을 내고 갈 수 있는지 없는지 bfs를 확인하여 체크
    • 최소값과 최대값을 다 체크하면서 bfs를 해야한다.
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
struct node {
	int diff;
	int mininum;
	int maxinum;
};
typedef pair<int, int> pi;
typedef pair<int, pi> pii;
priority_queue<pii,vector<pii>, greater<pii> > q;
int n, map[110][110];
node dist[110][110];
int dx[4] = { 0,0,1,-1 }, dy[4] = { 1,-1,0,0 };
int main() {
	scanf("%d", &n);
	
	for (int i = 0; i < n; i ++ ) {
		for (int j = 0; j < n; j++) {
			scanf("%d", &map[i][j]);
			dist[i][j].diff = 1e9;
		}
	}
	dist[0][0].diff = 0;
	dist[0][0].mininum = dist[0][0].maxinum = map[0][0];
	q.push({ 0,{0, 0} });
	while (!q.empty()) {
		pii now = q.top();
		if (now.second.first == n - 1 && now.second.second == n - 1) {
			printf("%d", now.first);
			break;
		}
		q.pop();
		for (int i = 0; i < 4; i++) {
			int nr = now.second.first + dx[i], nc = now.second.second + dy[i];
			if (0 <= nr && nr <= n && 0 <= nc && nc <= n) {
				int tmp_max = dist[now.second.first][now.second.second].maxinum;
				int tmp_min = dist[now.second.first][now.second.second].mininum;
				if (tmp_max < map[nr][nc]) tmp_max = map[nr][nc];
				if (tmp_min > map[nr][nc]) tmp_min = map[nr][nc];
				if (dist[nr][nc].diff > tmp_max - tmp_min) {
					q.push({ tmp_max - tmp_min,{nr, nc} });
					dist[nr][nc].diff = tmp_max - tmp_min;
					dist[nr][nc].maxinum = tmp_max;
					dist[nr][nc].mininum = tmp_min;
				}
			}
		}
	}

	
}