Untitled
unknown
plain_text
2 years ago
1.8 kB
4
Indexable
#include<iostream> using namespace std; int n, mountain[100][100]; int front, rear; int visit[100][100]; int dx[4] = {0, -1, 0, 1}; int dy[4] = {-1, 0, 1, 0}; int queueX[1000000]; int queueY[1000000]; void walk(int x, int y, int start, int end) { if (mountain[x][y] < start || mountain[x][y] > end) return; front = rear = 0; queueX[rear] = x; queueY[rear] = y; rear++; while (front < rear) { int xx = queueX[front]; int yy = queueY[front]; front++; for (int i = 0; i < 4; i++) { int _x = xx + dx[i]; int _y = yy + dy[i]; if (_x >= 0 && _x < n && _y >= 0 && _y < n) { if (visit[_x][_y] == 0) { if (mountain[_x][_y] >= start && mountain[_x][_y] <= end) { visit[_x][_y] = 1; queueX[rear] = _x; queueY[rear] = _y; rear++; } } } } } } int main(int argc, char** argv) { int test_case; int T; freopen("input.txt", "r", stdin); cin >> T; /* Read each test case from standard input. */ for(test_case = 1; test_case <= T; ++test_case) { cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> mountain[i][j]; } } int Left = 0, Right = 111; while (Left < Right) { int mid = (Left + Right) / 2; bool check = false; for (int i = 0; i <= 110; i++) { for (int k = 0; k < n; k++) { for (int j = 0; j < n; j++) { visit[k][j] = 0; } } visit[0][0] = 1; walk(0, 0, i, i + mid); if (visit[n - 1][n - 1] == 1) { check = true; break; } } if (check) Right = mid; else Left = mid + 1; } // Print the answer to standard output(screen). cout << "#" << test_case << " " << Left << endl; } return 0;//Your program should return 0 on normal termination. }
Editor is loading...