Cách biểu diễn khối Rubik trong cấu trúc dữ liệu


58

Nếu tôi đang cố gắng mô phỏng khối Rubik , bạn sẽ tạo cấu trúc dữ liệu như thế nào để lưu trữ trạng thái của khối trong bộ nhớ, với số lượng gạch X mỗi bên?

Những điều cần cân nhắc:

  • khối lập phương có thể có kích thước bất kỳ
  • nó là một khối Rubik, vì vậy các lớp có thể được xoay

2
Bài tập về nhà? Hoặc vấn đề trong thế giới thực ...
sdg

4
Bạn có thể quan tâm đến mã nguồn của Rubik's Cube Solver .
mouviciel

22
Tôi khá chắc chắn rằng số cạnh của một khối lập phương phải là 6
Simon Bergot

3
Tôi tò mò muốn xem một mô hình khối Rubik được làm phẳng để tôi có thể nhìn thấy tất cả các mặt cùng một lúc. Hmm, tôi muốn viết điều đó ngay bây giờ. Nó có thể là hình dạng của chữ T hoặc thậm chí được lát gạch vô tận nếu có thể (tôi không nghĩ đến cái sau).
Lee Kowalkowski

6
Tôi cảm thấy bị cám dỗ khi trích dẫn Eric Evans, "Mô hình không đúng, cũng không sai. Đơn giản là chúng ít nhiều hữu ích" (trích dẫn có thể không chính xác 100% vì nó được trích dẫn từ bộ nhớ)
Pete

Câu trả lời:


37

Có gì sai với một mảng cũ của kích thước [6X][X]? Bạn không cần biết về các hình khối nhỏ bên trong , bởi vì bạn không nhìn thấy chúng; chúng không phải là một phần của trạng thái của khối lập phương. Ẩn hai phương thức xấu xí đằng sau một giao diện dễ sử dụng và đơn giản để sử dụng, kiểm tra đơn vị cho đến chết và voila, bạn đã hoàn tất!


31
ngay cả một khối Rubik thực sự cũng không có bất kỳ khối nhỏ bên trong nào
jk.

8
Điều này sẽ hoạt động nhưng thuật toán của bạn có thể sẽ cực kỳ phức tạp để chứa một cấu trúc dữ liệu đơn giản như vậy.
maple_shaft

6
As long as you know how the six surfaces are "threaded" together Đó chính xác là những gì một cấu trúc dữ liệu mạnh mẽ hơn sẽ cung cấp cho bạn. Tôi nghĩ rằng chúng ta đang tranh luận cho cùng một điều. Một bên mảng và một bên là một mảng các khối, tuy nhiên, có rất nhiều thuộc tính thú vị về các mặt và khối giúp tìm ra "luồng" Không thực sự thích thuật ngữ đó vì nó có thể bị nhầm lẫn với đa luồng; )
maple_shaft

7
@maple_shaft "Đó chính xác là những gì một cấu trúc dữ liệu mạnh mẽ hơn sẽ cung cấp cho bạn." Tôi không biết về điều đó: một cấu trúc dữ liệu có nhiều "cấu trúc" hơn, nó nhất thiết sẽ mang lại sự phức tạp ngẫu nhiên bổ sung liên quan đến việc thiết lập, duy trì và truy cập các phần riêng lẻ của cấu trúc đó. Thật khó để nói điều gì sẽ phức tạp hơn - thực hiện những thay đổi xấu xí trên một mảng đơn giản với một số trường hợp góc cộng với "chuyến đi tự do" khi truy cập vào các ô riêng lẻ, hoặc một cấu trúc với các thay đổi ít phức tạp hơn và đọc phức tạp hơn một chút.
dasblinkenlight

16
Là một người thực sự đã viết các chương trình để thao túng khối Rubik, tôi đã sử dụng cách tiếp cận đơn giản là sử dụng sáu mảng hai chiều, mỗi mảng một mặt. Đúng là bạn phải thực hiện một số thao tác cơ bản trên khối lập phương có một chút khó chịu, nhưng sau đó bạn có thể quên đi việc đại diện. Nó không bao giờ là một vấn đề đối với tôi. Tôi thường tự hỏi làm thế nào các đại diện khác sẽ làm việc từ góc độ hiệu suất, nhưng không bao giờ cảm thấy gánh nặng từ góc độ mã hóa.
Peter ALLenWebb

39

Cần lưu ý rằng tôi là một người đam mê tốc độ, nhưng tôi chưa bao giờ cố gắng thể hiện một cách lập trình một khối Rubik trong một thuật toán hoặc cấu trúc dữ liệu.

Tôi có thể sẽ tạo các cấu trúc dữ liệu riêng biệt để nắm bắt các khía cạnh độc đáo của mỗi khối trong một khối.

Có 3 loại khối riêng biệt trên một khối:

  1. Khối góc - Nó có ba mặt màu và ba mảnh liền kề mà nó sẽ chia sẻ một mặt bất cứ lúc nào.

  2. Edge Block - Nó có hai mặt màu và có 4 mảnh liền kề mà nó sẽ chia sẻ một mặt bất cứ lúc nào. Trong các khối 3x3 nó luôn có 2 mảnh trung tâm và 2 mảnh góc.

  3. Khối trung tâm - Trong khối 3x3, mảnh này không thể di chuyển được, tuy nhiên nó có thể được xoay. Nó sẽ luôn có 4 khối cạnh liền kề. Trong các khối lớn hơn có nhiều khối trung tâm có thể chia sẻ với khối trung tâm khác hoặc một mảnh cạnh. Khối trung tâm không bao giờ liền kề với một khối góc.

Biết được điều này, một Khối có thể có một danh sách các tham chiếu đến các khối khác mà nó chạm vào. Tôi sẽ giữ một danh sách các danh sách khác, đó sẽ là danh sách các khối đại diện cho một mặt khối và một danh sách giữ các tham chiếu đến mọi mặt khối.

Mỗi mặt khối sẽ được thể hiện như một khuôn mặt độc đáo.

Với các cấu trúc dữ liệu này, sẽ rất dễ dàng để viết một thuật toán thực hiện chuyển đổi xoay trên mỗi mặt, di chuyển các khối thích hợp vào và ra khỏi danh sách thích hợp.

EDIT: Lưu ý quan trọng, tất nhiên các danh sách này phải được sắp xếp nhưng tôi quên đề cập đến điều đó. Ví dụ, nếu tôi lật mặt phải, thì khối bên trái góc phải di chuyển sang góc phải của mặt phải và được xoay theo chiều kim đồng hồ.


đồng ý rằng mỗi khối sẽ cần phải có các thuộc tính duy nhất. nhưng việc chuyển đổi sẽ không tẻ nhạt vì bạn phải cập nhật các tham chiếu đến các khối liền kề và của bạn list of lists. có lẽ tốt hơn là chỉ có một danh sách các khối mà bạn có thể truy vấn. và bạn chỉ cập nhật các tham chiếu khối liền kề khi bạn thực hiện chuyển đổi. Nếu bạn muốn một danh sách tất cả các khối trong một khuôn mặt thì bạn có thể truy vấn danh sách của mình cho tất cả các khối liền kề với (các) khối trung tâm, phải không?
Mel

@Mel Có thể làm theo cách này, nhưng sau khi nói chuyện với dasblinkenlight tôi thực sự nghĩ rằng cách tiếp cận của anh ta sẽ ít phức tạp hơn. Tôi ước rằng câu trả lời của anh ấy có nhiều phiếu hơn của tôi. Tôi không giỏi lắm với các thuật toán và là một thuật toán hiệu quả nhất, tôi chỉ thực sự thích các khối rubik và thu thập chúng (hơn 40 loại khác nhau từ khắp nơi trên thế giới).
maple_shaft

Mặc dù câu trả lời của dasblinknenlight là giải pháp đơn giản nhất, tôi trao thưởng cho bạn tiền thưởng vì tôi thích thực tế câu trả lời của bạn bao gồm một số logic cần thiết cho cấu trúc dữ liệu đó và các thuộc tính khối khác nhau
Rachel

Mô hình dữ liệu này đúng với thực tế hơn nhưng nó thực hiện một số thao tác đơn giản mà bạn muốn thực hiện khó hơn chúng - Chỉ cần đạt được trạng thái của khối sẽ yêu cầu di chuyển đệ quy qua danh sách các hình khối cồng kềnh.
Ziv

@Ziv Đúng, tuy nhiên câu hỏi đã hỏi về cấu trúc dữ liệu và không nhất thiết là về các thuật toán.
maple_shaft

13

Khi tôi nghĩ về vấn đề này, tôi nghĩ về một khối tĩnh với các màu di chuyển trên nó theo các mẫu đã biết. Vì thế....

Một đối tượng Cube chứa 6 đối tượng Side vẫn được cố định chỉ mục 0-5. Mỗi bên chứa 9 đối tượng vị trí vẫn được cố định chỉ mục 0-8. Mỗi vị trí chứa một màu.

Để đơn giản, xử lý mọi hành động theo gia số quý. Có 3 trục quay, mỗi hướng có thể có 2 hướng cho tổng số 6 hành động có thể có trên khối lập phương. Với thông tin này, nó trở thành một nhiệm vụ khá đơn giản để vạch ra 6 hành động có thể có trên khối lập phương.

Vì vậy, màu xanh lục ở bên 6, vị trí 3, có thể di chuyển sang bên 1 vị trí 3 hoặc bên 2 vị trí 7, trong số những người khác, tùy thuộc vào hành động được thực hiện. Tôi chưa khám phá điều này đủ để tìm thấy bất kỳ bản dịch toán học nào, nhưng các mẫu có thể sẽ xuất hiện để bạn có thể tận dụng mã.

Sử dụng cấu trúc dữ liệu, làm thế nào tôi có thể biết nếu một khối nhất định ở trạng thái nhất định có thể giải được không? Bản thân tôi đã phải vật lộn với câu hỏi này và chưa tìm được câu trả lời.

Để làm điều này, không bao giờ bắt đầu với một trạng thái khối ngẫu nhiên. Thay vào đó, hãy bắt đầu với trạng thái đã giải và thực hiện n hành động theo chương trình để đưa khối vào trạng thái bắt đầu ngẫu nhiên. Vì bạn chỉ thực hiện các hành động pháp lý để đến trạng thái hiện tại, khối phải được giải quyết.


1
Lời khuyên "bạn không muốn bắt đầu từ đây" cổ điển!
Ergwun

8

Tôi tìm thấy một hệ tọa độ xyz là một cách đơn giản để giải quyết khối Rubik và ma trận xoay một cách đơn giản, chung chung để thực hiện các phép quay.

Tôi đã tạo một lớp Piece chứa một vectơ vị trí (x, y, z). Một mảnh có thể được xoay bằng cách áp dụng ma trận xoay vào vị trí của nó (phép nhân vectơ ma trận). Piece cũng theo dõi các màu của nó trong một tuple (cx, cy, cz), cho các màu đối diện dọc theo mỗi trục. Một lượng nhỏ logic đảm bảo các màu này được cập nhật một cách thích hợp trong quá trình xoay: xoay 90 độ trong mặt phẳng XY có nghĩa là chúng ta sẽ trao đổi các giá trị của cxcy.

Vì tất cả logic xoay được gói gọn trong lớp Piece, Cube có thể lưu trữ một danh sách các mảnh ghép không theo thứ tự và việc quay có thể được thực hiện theo kiểu chung. Để thực hiện xoay vòng mặt trái, chọn tất cả các mảnh có tọa độ x là -1 và áp dụng ma trận xoay thích hợp cho mỗi Mảnh. Để thực hiện một vòng quay của toàn bộ khối, áp dụng cùng một ma trận xoay cho mỗi phần.

Việc thực hiện này rất đơn giản và có một vài điều thú vị:

  1. Vị trí của một đối tượng Piece sẽ thay đổi, nhưng màu sắc của nó thì không. Điều này có nghĩa là bạn có thể yêu cầu mảnh màu xanh lá cây màu đỏ, bám vào vật thể, thực hiện một số phép quay và kiểm tra cùng một vật thể để xem mảnh màu xanh đỏ kết thúc ở đâu.
  2. Mỗi loại mảnh (cạnh, trung tâm, góc) có một mẫu tọa độ duy nhất. Đối với khối lập phương 3x3, một mảnh góc không có số 0 trong vectơ vị trí của nó ( (-1, 1, 1)), một cạnh có chính xác một số không ( (1, 0, -1)) và một mảnh trung tâm có hai số 0 ( (-1, 0, 0)).
  3. Các ma trận xoay làm việc cho khối 3x3 sẽ hoạt động cho khối NxN.

Nhược điểm:

  1. Phép nhân vectơ ma trận chậm hơn so với các giá trị hoán đổi trong mảng.
  2. Tra cứu thời gian tuyến tính cho Pieces theo vị trí. Bạn sẽ phải lưu trữ các mảnh trong cấu trúc dữ liệu ngoài và cập nhật trong quá trình quay để tìm kiếm thời gian liên tục theo vị trí. Điều này đánh bại một số sự tao nhã của việc sử dụng ma trận xoay và rò rỉ logic xoay vào lớp Cube của bạn. Nếu tôi đang thực hiện bất kỳ loại giải pháp dựa trên tìm kiếm nào, tôi sẽ sử dụng một triển khai khác.
  3. Phân tích mẫu (trong khi giải) không tốt như nó có thể. Một mảnh không có kiến ​​thức về các mảnh liền kề của nó và phân tích sẽ chậm do các vấn đề hiệu suất ở trên.

3
Tôi đã thấy rằng loại triển khai này hoạt động tốt nhất để thể hiện khối trong một chương trình đồ họa 3D. Phép nhân ma trận làm cho nó có thể làm động các phép quay của lớp. Xem repo github này để biết ví dụ về cách tiếp cận này. Tôi đang xem xét rằng để thêm một bộ giải vào khối 3D của mình, tôi sẽ cần một thuật toán và cấu trúc dữ liệu từ một trong những câu trả lời khác.
Jonathan Wilson

5

bạn có thể sử dụng một mảng đơn giản (mỗi phần tử có ánh xạ từ 1 đến 1 thành hình vuông trên một mặt) và mô phỏng mỗi phép quay với một hoán vị nhất định

bạn có thể thoát khỏi chỉ với 3 hoán vị thiết yếu: xoay một lát với trục mặc dù mặt trước, xoay khối xung quanh trục dọc và xoay khối qua trục ngang qua mặt trái và phải. tất cả các động thái khác có thể được thể hiện bằng cách ghép ba của ba.

cách đơn giản nhất để biết liệu một khối có thể giải được hay không là giải quyết nó (tìm một loạt các hoán vị sẽ giải quyết khối này), nếu bạn kết thúc với 2 cạnh đã đổi chỗ, một cạnh lật, một góc lật đơn hoặc 2 góc hoán đổi bạn có một khối không thể phá hủy


1
the most straightforward way of know whether a cube is solvable is to solve it. Vâng, sử dụng mô hình mà bạn đề nghị tôi đoán đó là sự thật. Nhưng nếu bạn sử dụng mô hình gần hơn với các phép quay của @ maple_shaft và theo dõi, bạn có thể nhanh chóng kiểm tra xem khối lập phương 3x3x3 có thể giải quyết được hay không bằng cách xác minh tổng của các cạnh lật mod 2 là 0 và góc xoay mod 3 là 0. Sau đó kiểm tra tính chẵn lẻ của hoán vị bằng cách đếm các giao dịch hoán đổi cạnh và hoán đổi góc (cần thiết để quay lại giải quyết), tổng mod 2 của chúng phải là 0 (tổng chẵn lẻ). Đây là những thử nghiệm cần và đủ để chứng minh khối lập phương có thể giải được.
jimhark

3

Điều kiện đầu tiên mà nó có thể giải quyết được là mỗi mảnh có mặt và màu sắc trên mỗi mảnh có thể được sử dụng để lắp ráp một khối lập phương "sovled". Đây là một điều kiện tương đối tầm thường mà sự thật có thể được xác định bằng một danh sách kiểm tra đơn giản. Phối màu trên khối "tiêu chuẩn" được xác định , nhưng ngay cả khi bạn không xử lý khối lập phương tiêu chuẩn thì chỉ có 6! kết hợp có thể của các khuôn mặt được giải quyết.

Một khi bạn có tất cả các mảnh và màu sắc đúng, thì vấn đề là xác định xem có cấu hình vật lý nào có thể giải quyết được hay không. Không phải tất cả trong số họ là. Cách ngây thơ nhất để kiểm tra điều này là chạy một thuật toán giải khối và xem liệu nó có kết thúc với một khối đã giải không. Tôi không biết nếu có các kỹ thuật kết hợp lạ mắt để xác định khả năng thanh toán mà không thực sự cố gắng giải quyết khối lập phương.

Đối với cấu trúc dữ liệu nào ... điều đó gần như không quan trọng. Phần khó khăn là làm cho các phép biến đổi trở nên đúng và có thể biểu diễn trạng thái khối theo cách cho phép bạn làm việc gọn gàng với các thuật toán có sẵn trong tài liệu. Như trục Maple chỉ ra có ba loại mảnh. Văn học về giải khối lập phương của rubik luôn đề cập đến các mảnh theo loại của chúng. Các biến đổi cũng được thể hiện theo những cách phổ biến (tra cứu ký hiệu Singmaster ). Ngoài ra, tất cả các giải pháp mà tôi thấy luôn luôn đề cập đến một phần như một điểm tham chiếu (thường đặt phần trung tâm màu trắng ở dưới cùng).


1
Đối với điểm 2, thay vì bắt đầu với một khối ngẫu nhiên và kiểm tra xem nó có thể giải được không. Tôi sẽ bắt đầu với một khối đã giải và thực hiện n hành động ngẫu nhiên trên khối để đưa nó vào trạng thái ngẫu nhiên.
Matthew Vines

Vâng, hoàn toàn, đó là cách đơn giản nhất để tạo ra một cấu hình có thể giải quyết được về mặt vật lý. Bắt đầu với một cấu hình tùy ý và xác định xem nó có thể giải quyết được hay không chắc chắn là một vấn đề riêng biệt nhưng có liên quan.
Angelo

2
Bạn phỏng đoán rằng có thể có "các kỹ thuật ưa thích" để xác định xem một khối có thể giải được không; trong thực tế có. Nếu bạn tháo rời một khối lập phương nhưng vẫn dán các miếng dán, sau đó lắp lại khối lập phương, bạn không nhất thiết phải có một khối lập phương có thể giải được; trong thực tế, tỷ lệ cược là một đến mười hai so với việc bạn có một khối có thể giải được. Bạn có thể xác định nếu bạn ở trạng thái có thể giải được thông qua phân tích chẵn lẻ các cạnh và góc; bạn thực sự không phải cố gắng giải khối lập phương.
Eric Lippert

1
Dưới đây là một tổng quan ngắn gọn về ba loại thuộc tính cặp khối phải được bảo tồn để khối có thể giải được. ryanheise.com/cube/cube_laws.html .
Eric Lippert

1
Tôi đã đăng câu hỏi đó lên trang web stackexchange và nhận được câu trả lời rất hay: math.stackexchange.com/questions/127577/ chủ
Mel

3

Vì bạn đã nhận được câu trả lời tuyệt vời, hãy để tôi chỉ thêm một chi tiết.

Bất kể đại diện cụ thể của bạn là gì, lưu ý rằng ống kính là một công cụ rất tốt để "phóng to" trên các phần khác nhau của khối lập phương. Ví dụ, hãy xem chức năng cycleLefttrong mã Haskell này . Đây là một hàm chung cho phép theo chu kỳ bất kỳ danh sách độ dài 4. Mã để thực hiện di chuyển L trông như thế này:

moveL :: Aut (RubiksCube a)
moveL =
    cong cube $ cong leftCols cycleLeft
              . cong leftSide rotateSideCW

Do đó cycleLefthoạt động trên quan điểm được đưa ra bởi leftCols . Tương tự, rotateSideCWlà một hàm chung lấy một bên cho phiên bản xoay của nó, hoạt động trên khung nhìn được đưa ra bởi leftSide. Các động thái khác có thể được thực hiện theo cách tương tự.

Mục tiêu của thư viện Haskell là tạo ra những bức tranh đẹp. Tôi nghĩ rằng nó đã thành công: Các thư viện sơ đồ-rubiks-cube đang hoạt động


2

Bạn dường như đang hỏi hai câu hỏi riêng biệt.

  1. Làm thế nào để biểu diễn một khối lập phương có số cạnh X?

Nếu bạn định mô phỏng khối Rubic trong thế giới thực, thì tất cả các khối Rubik đều có 6 cạnh. Tôi nghĩ ý của bạn là "X số lượng gạch trên mỗi chiều". Mỗi bên của khối Rubic ban đầu là 3x3. Các kích thước khác bao gồm 4 x 4 (Giáo sư Cube), 5x5 và 6x6.

Tôi sẽ biểu diễn dữ liệu với 6 mặt, sử dụng ký hiệu giải khối "tiêu chuẩn":

  • TRƯỚC: mặt đối mặt với người giải
  • TRỞ LẠI
  • ĐÚNG
  • TRÁI
  • LÊN
  • XUỐNG

Mỗi bên là một mảng 2 chiều của X by X.


Bạn có thể mua một khối 17x17 ! Nó có một số thỏa hiệp cơ học, nhưng nó là đẳng cấu với thực tế.
RBerteig

1

Tôi thích ý tưởng @maple_shaft đại diện cho các mảnh khác nhau (khối nhỏ) khác nhau: các mảnh trung tâm, cạnh và góc mang lần lượt 1, 2 hoặc 3 màu.

Tôi muốn biểu thị các mối quan hệ giữa chúng dưới dạng biểu đồ (hai chiều), với các cạnh kết nối các phần liền kề. Mỗi mảnh sẽ có một mảng các khe cho các cạnh (kết nối): 4 khe ở các mảnh trung tâm, 4 khe ở các cạnh, 3 khe ở các góc. Ngoài ra, các mảnh trung tâm có thể có 4 kết nối với các mảnh cạnh và 4 cho các mảnh góc riêng biệt và / hoặc các mảnh cạnh có thể có 2 kết nối với các mảnh trung tâm và 2 mảnh riêng biệt.

Các mảng này được sắp xếp sao cho lặp đi lặp lại trên các cạnh của đồ thị luôn đại diện cho phép quay 'giống nhau', điều chỉnh xoay vòng của khối. Đó là, ví dụ, đối với một mảnh trung tâm, nếu bạn xoay khối lập phương sao cho mặt của nó ở trên cùng, thứ tự các kết nối luôn luôn theo chiều kim đồng hồ. Tương tự cho các mảnh cạnh và góc. Khách sạn này giữ sau khi xoay mặt (hoặc vì vậy nó dường như với tôi bây giờ).

  • Tìm mảnh thuộc về một cạnh là tầm thường.
  • Tìm những mảnh thuộc về một khuôn mặt là chuyện nhỏ.
  • Tìm các mặt nằm ở hướng đã định cho mặt đã cho hoặc mặt đối diện đang đi qua 2 hoặc 3 liên kết được xác định rõ.
  • Để xoay mặt, cập nhật kết nối của tất cả các mảnh được kết nối với mảnh trung tâm của khuôn mặt.

Việc phát hiện các điều kiện rõ ràng không thể giải quyết (các cạnh bị tráo đổi / lật, góc bị tráo đổi) nếu hy vọng cũng dễ dàng, bởi vì việc tìm kiếm các loại thuộc loại cụ thể và định hướng của chúng là đơn giản.


1

Làm thế nào về các nút và con trỏ?

Giả sử luôn có 6 mặt và 1 nút đó biểu thị 1 ô vuông trên 1 mặt:

r , g , b
r , g , b
r , g , b
|   |   |
r , g , b - r , g , b
r , g , b - r , g , b
r , g , b - r , g , b

Một nút có một con trỏ đến mỗi nút bên cạnh nó. Xoay vòng tròn chỉ di chuyển con trỏ (Số nút / Số mặt) -1 nút trên, trong trường hợp này 2. Vì tất cả các phép quay là xoay vòng tròn, bạn chỉ cần xây dựng một rotatehàm. Nó là đệ quy, di chuyển mỗi nút một không gian và kiểm tra xem nó đã di chuyển chúng đủ chưa, vì nó sẽ thu thập số lượng nút và luôn có bốn mặt. Nếu không, tăng số lần di chuyển giá trị và gọi lại xoay.

Đừng quên nó được liên kết đôi, vì vậy cũng cập nhật các nút mới được chỉ. Sẽ luôn có chiều cao * Chiều rộng của các nút được di chuyển, với một con trỏ được cập nhật trên mỗi nút, do đó cần có Chiều cao * Chiều rộng * 2 số con trỏ được cập nhật.

Vì tất cả các nút trỏ vào nhau, chỉ cần đi vòng quanh cập nhật từng nút khi bạn đến với nó.

Điều này sẽ làm việc cho bất kỳ khối có kích thước, không có trường hợp cạnh hoặc logic phức tạp. Nó chỉ là một con trỏ đi bộ / cập nhật.


-1

Từ kinh nghiệm cá nhân sử dụng một bộ để theo dõi từng phần quay của khối lập phương hoạt động tốt. Mỗi khối phụ nằm trong ba bộ không có kích thước của khối rubik. Vì vậy, để tìm một khối con một số nơi trong khối lập phương của rubik, bạn chỉ cần lấy giao điểm của ba bộ (kết quả là một khối con). Để thực hiện di chuyển, loại bỏ các khối con bị ảnh hưởng khỏi các bộ liên quan đến việc di chuyển và sau đó đưa chúng trở lại vào các bộ lấy chúng làm kết quả của việc di chuyển.

Khối 4 x 4 sẽ có 12 bộ. 6 bộ cho 6 mặt và 6 bộ cho sáu dải xung quanh khối. Mỗi mặt có 16 khối con và mỗi dải có 12 khối con. Có tổng cộng 56 hình khối phụ. Mỗi khối phụ chứa thông tin về màu sắc và hướng của màu sắc. Bản thân khối rubik là một mảng 4 x 4 với mỗi phần tử có thông tin bao gồm 3 bộ xác định khối con tại vị trí đó.

Không giống như 11 câu trả lời khác, cấu trúc dữ liệu này có bạn sử dụng giao điểm của các tập hợp để xác định từng vị trí khối phụ trong khối. Điều này tiết kiệm công việc phải cập nhật các khối phụ gần khi thực hiện thay đổi.


điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 11 câu trả lời trước
gnat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.