Mình nghĩ theo hướng của mình thôi. Chắc cũng chưa tối ưu.
Đầu tiên phải nhận dạng đc đảo trước bằng cách gom hết các ô 0 lại vào 1 list. Nhận dạng đảo bằng cách mỗi 1 ô bất kỳ(ngoài trừ các ô đụng lề) đều có 8 neighbors bao quanh) Cứ ô neighbor nào 0 thì add vào list đảo, ô nào 1 không add. Add đến khi nào không add đc nữa thì nhảy sang 1 ô khác tiếp tục. Nên dùng stack hoặc queue để giảm bớt quá trình add này.
Sau đó phải xác định đc các góc của đảo. Góc là các ô trong list đảo có số neighbors(=1) bao quanh lớn nhất.
Tính công thức dist từ 1 góc của 1 đảo đến 1 góc của 1 đảo khác. Tìm tất cả đảo rồi chọn đường ngắn nhất. Ko xét đến 2 đảo này nữa. Rồi cứ lặp lại đến khi hết.
Cách này dạng Dijkstra’s algorithm. Ko chắc chắn ngắn nhất nhưng thời gian giải đc nhanh nhất.