Untitled
unknown
plain_text
2 years ago
2.9 kB
11
Indexable
Moutain Walking Cho một bản đồ kích thước NxN (2 <= N <= 100), mỗi ô mang giá trị là độ cao của ô đó (0 <= độ cao <= 110). Bác John và bò Bessie đang ở ô trên trái (dòng 1, cột 1) và muốn đi đến cabin (dòng N, cột N). Họ có thể đi sang phải, trái, lên trên và xuống dưới nhưng không thể đi theo đường chéo. Hãy giúp bác John và bò Bessie tìm đường đi sao cho chênh lệch giữa điểm cao nhất và thấp nhất trên đường đi là nhỏ nhất. Input Dòng 1: Số test case Dòng 2: N N dòng tiếp theo chứa N số nguyên, mỗi số cho biết cao độ của một ô. Output In ra #test case và một số nguyên là chênh lệch độ cao nhỏ nhất. Sample Input 5 5 1 1 3 6 8 1 2 2 5 5 4 4 0 3 3 8 0 2 3 4 4 3 0 2 1 5 99 85 38 22 55 89 28 33 3 65 99 20 14 67 90 36 27 28 77 31 50 45 12 9 14 2 92 83 19 91 5 61 49 32 34 28 100 65 0 10 89 34 99 40 86 4 10 97 49 21 30 95 33 79 51 65 2 17 60 94 27 Output #1 2 #2 85 #3 9 #4 50 #5 43 #include<iostream> using namespace std; int N; int arr[200][200]; int vis[200][200]; int Qx[10000000]; int Qy[10000000]; int front=-1, rear=-1; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; void push(int x, int y) { rear++; Qx[rear]=x; Qy[rear]=y; } void pop(int &x, int &y) { front++; x=Qx[front]; y=Qy[front]; } void bfs(int x, int y, int start, int end) { if(arr[x][y]<start || arr[x][y]>end) { return; } push(x,y); while (front < rear) { pop(x,y); for (int i=0;i<4;i++) { int xx= x+dx[i]; int yy= y+dy[i]; if(xx>=0 && xx<N && yy>=0 && yy<N) { if(vis[xx][yy] == 0) { if(arr[xx][yy]>=start && arr[xx][yy]<=end) { vis[xx][yy]=1; push(xx,yy); } } } } } } int main(int argc, char** argv) { int test_case; int T; int Answer; ios::sync_with_stdio(false); freopen("input.txt", "r", stdin); cin >> T; for(test_case = 1; test_case <= T; ++test_case) { Answer = 0; cin >> N; for (int i=0;i<N;i++) { for (int j=0;j<N;j++) { cin >> arr[i][j]; } } front=rear=-1; int Left = 0, Right = 111; while (Left < Right) { int Mid = (Left + Right) / 2; bool check = false; for (int i = 0; i < Right; i++) { for (int k = 0; k < N; k++) { for (int j = 0; j < N; j++) { vis[k][j] = 0; } } vis[0][0] = 1; bfs(0, 0, i, i + Mid); if (vis[N - 1][N - 1] == 1) { check = true; break; } } if (check) { Right = Mid; } else { Left = Mid + 1; } } cout << "#" << test_case << " " << Left << endl; } return 0;//Your program should return 0 on normal termination. }
Editor is loading...