Vậy là tôi có ma trận 4x4 như thế này
|0 1 2 3
-+------
0|0 1 3 6
1|2 4 7 một
2|5 8 phòng
3|9 cef
Và tôi lặp lại nó theo thứ tự được chỉ định bởi các ký tự thập lục phân trong đó. Vì vậy, hãy bắt đầu bằng (0, 0), sau đó (1, 0), (0, 1), (2, 0), (1, 1), (0, 2)...
Mã này như sau:
đường chéo def (n):
cho một phạm vi (n):
cho b trong phạm vi (a + 1):
mang lại a - b, b
cho một phạm vi (n - 1):
cho b trong phạm vi (n - a - 1):
năng suất n - b - 1, b + 1 + a
Đi qua điều này mang lại
cho x, y theo đường chéo(4):
in((x, y))
# (0, 0)
# (1, 0)
# (0, 1)
# (2, 0)
# (1, 1)
# (0, 2)
# (3, 0)
# (hai mươi mốt)
# (1, 2)
# (0, 3)
# (3, 1)
# (hai mươi hai)
# (1, 3)
# (3, 2)
# (hai mươi ba)
# (3, 3)
Đây chính xác là những gì tôi muốn. Phần tôi đang mắc kẹt là cố gắng tạo một hàm trong đó tôi cung cấp cho nó chỉ mục và nó cung cấp cho tôi tọa độ. Vì vậy, đối với ma trận 4x4 của tôi, (cái này vẫn ở dạng hex)
0 -> (0, 0)
1 -> (1, 0)
2 -> (0, 1)
3 -> (2, 0)
4 -> (1, 1)
5 -> (0, 2)
6 -> (3, 0)
7 -> (2, 1)
8 -> (1, 2)
9 -> (0, 3)
một -> (3, 1)
b -> (2, 2)
c -> (1, 3)
d -> (3, 2)
e -> (2, 3)
f -> (3, 3)
Tôi dự định tiếp tục sử dụng ma trận vuông có kích thước thay đổi nên không thể mã hóa cứng các giá trị vào từ điển.
Tôi đã dành hàng giờ để cố gắng làm cho nó hoạt động nhưng suốt đời tôi không thể làm cho nó hoạt động được.
Đó không phải là bài tập về nhà, đó chỉ là việc tôi làm trong thời gian rảnh rỗi và nó đang dần đẩy tôi vào ngõ cụt.
Nếu có điều gì chưa rõ, xin vui lòng hỏi.
Cảm ơn trước.
EDIT: Tôi nghĩ ai đó sẽ bình luận về bài đăng này Ma trận đi ngang trong dải chéoĐiều này tương tự, nhưng giống như hàm đầu tiên của tôi, nó chỉ lặp lại tọa độ và tôi không thể tính tọa độ từ chỉ mục.
Đây là một chức năng dường như làm những gì bạn muốn. Có lời giải thích sau code.
từ sqrt nhập toán học
định nghĩa tam giác (n):
trả về n * (n + 1) // 2
def coords_from_index(ndx, n=4):
nếu ndx < tam giác (n):
basecol = (int(sqrt(8 * ndx + 1)) - 1) // 2
row = ndx - tam giác(basecol)
col = basecol - hàng
khác:
oldcol, oldrow = coords_from_index(n**2 - 1 - ndx, n)
hàng = n - 1 - oldrow
col=n-1-oldcol
trả về col, hàng
#Mã kiểm tra
n=4
cho ndx trong phạm vi (n**2):
print(hex(ndx)[2:], '->', coords_from_index(ndx, n))
Bản in của mã kiểm tra này là:
0 -> (0, 0)
1 -> (1, 0)
2 -> (0, 1)
3 -> (2, 0)
4 -> (1, 1)
5 -> (0, 2)
6 -> (3, 0)
7 -> (2, 1)
8 -> (1, 2)
9 -> (0, 3)
một -> (3, 1)
b -> (2, 2)
c -> (1, 3)
d -> (3, 2)
e -> (2, 3)
f -> (3, 3)
Đây là một mô tả ngắn gọn về mã của tôi.
Giống như mã tạo tọa độ theo thứ tự của bạn, tôi xử lý tam giác phía trên bên trái của hình vuông khác với tam giác phía dưới bên phải. Trước tiên chúng ta hãy nhìn vào hình tam giác phía trên bên trái để biết kích thước 4
hình vuông chứa chỉ số 0
đến 9
.
Nếu bạn nhìn vào những con số ở đầu mỗi cột, bạn sẽ thấy đây là những "số tam giác", được bắt nguồn từ 0
Tổng các số nguyên bắt đầu liên tiếp. Vậy hàng trên cùng là 0
,0+1
,0+1+2
Và 0+1+2+3
. Công thức nổi tiếng cho những con số này là
tam giác(n) = n * (n + 1) // 2
Vì vậy tôi đã viết một thủ tục nhỏ cho việc này. Nếu bạn biết số lượng giác (gọi nó lànx
) và muốn tìmn
, bạn có thể giải phương trình bậc hai bằng đại số để có được
n = (sqrt(8 * ndx + 1) - 1) // 2
Nếu bạn muốn mét vuông
Thay thế bằng int(sqrt(
, bạn sẽ nhận được kết quả tương tự cho các số lượng giác và cho mọi nx
nằm giữa hai số tam giác. Sau đó, bạn có thể sử dụng chỉ mục và "cardinality" để tìm cột và hàng tương ứng với chỉ mục.
Bây giờ, nếu bạn nhìn vào hình tam giác phía dưới bên phải, bao gồm chỉ số Một
đến f
, bạn sẽ nhận thấy rằng nó đối xứng với hình tam giác ở góc trên bên trái. Tôi đã chọn sử dụng tính đối xứng đó để tính toán các hàng và cột của bất kỳ chỉ mục nào trong số này. Tôi có thể tính toán chúng một cách trực tiếp hơn, nhưng phương pháp tôi sử dụng đã có hiệu quả.
Lưu ý rằng nếu bạn sử dụng rất lớn n
Và nx
thì giá trị int(sqrt(
Không phải lúc nào cũng đưa ra câu trả lời đúng do tính không nhất quán của số học dấu phẩy động. Nhưng nx
需要Rấtlớn, khoảng 2**50
, đã xảy ra trước đó. Nếu bạn cần một quy trình đáng tin cậy hơn để tính căn bậc hai số nguyên, vui lòng cho tôi biết.
Tôi là một lập trình viên xuất sắc, rất giỏi!