Untitled
unknown
plain_text
2 years ago
1.7 kB
4
Indexable
#include <iostream> using namespace std; int map[105][105]; int visit[105][105]; int Qx[150000]; int Qy[150000]; int r = -1, f = -1; int dx[8]= {1,0,0,-1}; int dy[8]= {0,1,-1,0}; int n, m; int low, high; void push(int x, int y){ r++; Qx[r] = x; Qy[r] = y; } void pop(int &x, int &y){ f++; x = Qx[f]; y = Qy[f]; } bool haspath(int low_h, int high_h){ r = f = -1; int x = 0; int y = 0; push(x,y); visit[x][y] = 1; while(r != f){ 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((map[xx][yy] < low_h || map[xx][yy] > high_h) || visit[xx][yy] == 1) continue; else if(map[xx][yy] >= low_h && map[xx][yy] <= high_h ){ if(xx == n-1 && yy == n-1){ return true; } push(xx,yy); visit[xx][yy] = 1; } } } } return false; } bool isok(int range){ for(int i = low; i <= high - range; i++){ if(haspath(i, i + range)){ return true; } } return false; } int min_dis(int low, int high){ int left = 0; int right = high - low; int mid; while(left <= right){ mid = (right + left)/2; if(isok(mid)){ right = mid-1; } else left = mid+1; } return left; } int main(){ freopen("input.txt","r",stdin); int T; cin >> T; for(int tc = 1; tc <= T; tc++){ cin >> n; low = 1000; high = -1; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ cin >> map[i][j]; visit[i][j] = 0; if(map[i][j] < low){ low = map[i][j]; } if(map[i][j] > high){ high = map[i][j]; } } } cout << min_dis(low,high) << endl; } return 0; }
Editor is loading...