Đây là một kỹ thuật để mã hóa tất cả các hướng dưới dạng mảng - mỗi cặp di[i],dj[i]
là một hướng khác nhau.
Nếu chúng ta tưởng tượng rằng chúng ta có một mảnh ở vị trí x, y và chúng ta muốn thêm vào giá trị x và y của nó để di chuyển nó đến một vị trí gần đó, 1,0 là phía đông, -1,0 là phía tây, 0,1 là phía nam, 0, -1 là phía bắc, v.v.
(Ở đây tôi đã nói trên cùng bên trái là 0,0 và dưới cùng bên phải là 4,4 và cho thấy mỗi chỉ mục của mảng sẽ thực hiện di chuyển gì từ điểm trung tâm, X, tại 2,2.)
.....
.536.
.1X0.
.724.
.....
Cách nó được thiết lập, nếu bạn làm ^1
( ^
là XOR bit) trên chỉ mục, bạn sẽ nhận được hướng ngược lại - 0 và 1 là đối lập, 2 và 3 là đối lập, v.v. (Một cách khác để thiết lập nó là đi theo chiều kim đồng hồ bắt đầu từ phía bắc - sau đó đưa ^4
bạn theo hướng ngược lại.)
Bây giờ bạn có thể kiểm tra tất cả các hướng từ một điểm nhất định bằng cách lặp lại di
vàdj
mảng mảng , thay vì cần phải viết ra từng hướng trên dòng riêng của nó (tổng cộng là tám hướng!) (Đừng quên kiểm tra giới hạn :))
diK
và djK
tạo thành tất cả các hướng hiệp sĩ thay vì tất cả các hướng liền kề. Ở đây, ^1
sẽ lật dọc theo một trục, ^4
sẽ cung cấp cho hiệp sĩ đối diện bước nhảy.
.7.6.
0...5
..K..
1...4
.2.3.
d={0,1,0,-1,0}
cho điều này: các cặp mụcd[i], d[i+1]
cho tôi bốn hướng cơ bản.