MoutainWalking
user_4230122
c_cpp
a year ago
2.0 kB
9
Indexable
#include <iostream> using namespace std; int t, n; int arr[102][102]; int visit[102][102]; int dx[4] = { -1,0,1,0 }; int dy[4] = { 0,1,0,-1 }; int min1,max1; class Queue { public: int front, rear; int data[20004]; void reset() { front = rear = -1; } void enQueue(int x) { data[++rear] = x; } int deQueue() { return data[++front]; } bool isEmpty() { return front == rear ? true : false; } }; Queue q; void reset() { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { visit[i][j] = 0; } } } bool checkBien(int x, int y) { if (x >= 1 && x <= n && y >= 1 && y <= n) return true; return false; } bool BFS(int min, int max) { if (arr[1][1] > max || arr[1][1] < min) return false; q.reset(); reset(); q.enQueue(1); q.enQueue(1); visit[1][1] = 1; while (!q.isEmpty()) { int x = q.deQueue(); int y = q.deQueue(); for (int i = 0; i < 4; i++) { int newX = x + dx[i]; int newY = y + dy[i]; if (checkBien(newX, newY) && visit[newX][newY] == 0 && arr[newX][newY] >= min && arr[newX][newY] <= max) { if (newX == n && newY == n) { return true; } q.enQueue(newX); q.enQueue(newY); visit[newX][newY] = 1; } } } return false; } int solve(int height) { for (int j = min1; j <= max1; j++) { int min = j; int max = j + height; if (BFS(min, max)) return 1; } return 0; } int Try(int left, int right) { if (left >= right) return left; int mid = (left + right) / 2; if (solve(mid)) { Try(left, mid); } else { Try(mid + 1, right); } } int main() { cin >> t; for (int tc = 0; tc < t; tc++) { cin >> n; min1 = 1000000; max1 = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> arr[i][j]; if (min1 > arr[i][j]) { min1 = arr[i][j]; } if (max1 < arr[i][j]) { max1 = arr[i][j]; } } } cout << "#" << tc+1 << " " << Try(0, 110); } return 0; }
Editor is loading...
Leave a Comment