Bài này có thể sử dụng tìm kiếm nhị phân kết hợp với BFS/DFS,
độ phức tạp là \(O(N^2 H\log H)\) với \(H = 110\) là độ cao tối đa.
Phần sau sẽ trình bày cách sử dụng Disjoint Set để làm bài này.
Đầu tiên ta lưu dữ liệu vào một mảng \(A\), \(A[h]\) chứa tọa độ các ô có độ
cao là \(h\).
Gọi \(low\) là chiều cao nhỏ hơn trong chiều cao của 2 ô \((1,1)\) và \((N,N)\), và
\(high\) là chiều cao lớn hơn. Dễ thấy kết quả phải lớn hơn hoặc bằng \(low-high\) và đi qua các
đỉnh có chiều cao ở giữa \(low\) và \(high\) sẽ không làm ảnh hưởng đến kết quả.
Từ nhận xét trên ta thêm tất cả các đỉnh có chiều cao giữa \(low\) và \(high\)
vào tập các đỉnh đang xét. Sau đó lần lượt duyệt \(h\) từ \(low\) trở về 0:
Ở mỗi bước ta thêm các đỉnh trong \(A[h]\) vào các đỉnh đang xét, sau đó thử
cho \(k\) chạy từ \(high\) trở lên, thêm \(A[k]\) vào các đỉnh đang xét rồi kiểm tra xem
có thể đi từ \((1,1)\) đến \((N,N)\) không.
Để làm được thao tác trên ta cần chỉnh sửa cấu trúc Disjoint Set lại một ít.
Xem code bên dưới để biết thêm chi tiết.