Funciton , không cạnh tranh
CẬP NHẬT! Cải thiện hiệu suất lớn! n = 7 bây giờ hoàn thành trong vòng dưới 10 phút! Xem giải thích ở phía dưới!
Đây là niềm vui tốt để viết. Đây là một người giải quyết vũ phu cho vấn đề này được viết bằng Funciton. Một số thực tế:
- Nó chấp nhận một số nguyên trên STDIN. Bất kỳ khoảng trắng bên ngoài nào sẽ phá vỡ nó, bao gồm một dòng mới sau số nguyên.
- Nó sử dụng các số từ 0 đến n - 1 (không phải 1 đến n ).
- Nó lấp đầy lưới Quay ngược lại, vì vậy bạn có được một giải pháp trong đó hàng dưới cùng đọc
3 2 1 0
thay vì nơi hàng trên cùng đọc 0 1 2 3
.
- Nó xuất chính xác
0
(giải pháp duy nhất) cho n = 1.
- Đầu ra trống cho n = 2 và n = 3.
- Khi được biên dịch thành exe, mất khoảng 8¼ phút cho n = 7 (khoảng một giờ trước khi cải thiện hiệu suất). Nếu không biên dịch (sử dụng trình thông dịch) thì sẽ mất khoảng 1,5 lần thời gian, vì vậy sử dụng trình biên dịch là đáng giá.
- Như một cột mốc cá nhân, đây là lần đầu tiên tôi viết toàn bộ chương trình Funciton mà không viết chương trình đầu tiên bằng ngôn ngữ mã giả. Tôi đã viết nó trong C # thực tế đầu tiên mặc dù.
- (Tuy nhiên, đây không phải là lần đầu tiên tôi thực hiện thay đổi để cải thiện ồ ạt hiệu năng của một thứ gì đó trong Funciton. Lần đầu tiên tôi làm điều đó là trong chức năng giai thừa. thuật toán nhân hoạt động như thế nào . Chỉ trong trường hợp bạn tò mò.)
Nếu không có thêm rắc rối:
┌────────────────────────────────────┐ ┌─────────────────┐
│ ┌─┴─╖ ╓───╖ ┌─┴─╖ ┌──────┐ │
│ ┌─────────────┤ · ╟─╢ Ӂ ╟─┤ · ╟───┤ │ │
│ │ ╘═╤═╝ ╙─┬─╜ ╘═╤═╝ ┌─┴─╖ │ │
│ │ └─────┴─────┘ │ ♯ ║ │ │
│ ┌─┴─╖ ╘═╤═╝ │ │
│ ┌────────────┤ · ╟───────────────────────────────┴───┐ │ │
┌─┴─╖ ┌─┴─╖ ┌────╖ ╘═╤═╝ ┌──────────┐ ┌────────┐ ┌─┴─╖│ │
│ ♭ ║ │ × ╟───┤ >> ╟───┴───┘ ┌─┴─╖ │ ┌────╖ └─┤ · ╟┴┐ │
╘═╤═╝ ╘═╤═╝ ╘══╤═╝ ┌─────┤ · ╟───────┴─┤ << ╟─┐ ╘═╤═╝ │ │
┌───────┴─────┘ ┌────╖ │ │ ╘═╤═╝ ╘══╤═╝ │ │ │ │
│ ┌─────────┤ >> ╟─┘ │ └───────┐ │ │ │ │ │
│ │ ╘══╤═╝ ┌─┴─╖ ╔═══╗ ┌─┴─╖ ┌┐ │ │ ┌─┴─╖ │ │
│ │ ┌┴┐ ┌───────┤ ♫ ║ ┌─╢ 0 ║ ┌─┤ · ╟─┤├─┤ ├─┤ Ӝ ║ │ │
│ │ ╔═══╗ └┬┘ │ ╘═╤═╝ │ ╚═╤═╝ │ ╘═╤═╝ └┘ │ │ ╘═╤═╝ │ │
│ │ ║ 1 ╟───┬┘ ┌─┴─╖ └───┘ ┌─┴─╖ │ │ │ │ │ ┌─┴─╖ │
│ │ ╚═══╝ ┌─┴─╖ │ ɓ ╟─────────────┤ ? ╟─┘ │ ┌─┴─╖ │ ├─┤ · ╟─┴─┐
│ ├─────────┤ · ╟─┐ ╘═╤═╝ ╘═╤═╝ ┌─┴────┤ + ╟─┘ │ ╘═╤═╝ │
┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ╔═╧═╕ ╔═══╗ ┌───╖ ┌─┴─╖ ┌─┴─╖ ╘═══╝ │ │ │
┌─┤ · ╟─┤ · ╟───┐ └┐ └─╢ ├─╢ 0 ╟─┤ ⌑ ╟─┤ ? ╟─┤ · ╟──────────────┘ │ │
│ ╘═╤═╝ ╘═╤═╝ └───┐ ┌┴┐ ╚═╤═╛ ╚═╤═╝ ╘═══╝ ╘═╤═╝ ╘═╤═╝ │ │
│ │ ┌─┴─╖ ┌───╖ │ └┬┘ ┌─┴─╖ ┌─┘ │ │ │ │
│ ┌─┴───┤ · ╟─┤ Җ ╟─┘ └────┤ ? ╟─┴─┐ ┌─────────────┘ │ │
│ │ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │ │╔════╗╔════╗ │ │
│ │ │ ┌──┴─╖ ┌┐ ┌┐ ┌─┴─╖ ┌─┴─╖ │║ 10 ║║ 32 ║ ┌─────────────────┘ │
│ │ │ │ << ╟─┤├─┬─┤├─┤ · ╟─┤ · ╟─┘╚══╤═╝╚╤═══╝ ┌──┴──┐ │
│ │ │ ╘══╤═╝ └┘ │ └┘ ╘═╤═╝ ╘═╤═╝ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ │
│ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ╔═╧═╕ └─┤ ? ╟─┤ · ╟─┤ % ║ │
│ └─────┤ · ╟─┤ · ╟──┤ Ӂ ╟──┤ ɱ ╟─╢ ├───┐ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │
│ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═══╝ ╚═╤═╛ ┌─┴─╖ ┌─┴─╖ │ └────────────────────┘
│ └─────┤ │ └───┤ ‼ ╟─┤ ‼ ║ │ ┌──────┐
│ │ │ ╘═══╝ ╘═╤═╝ │ │ ┌────┴────╖
│ │ │ ┌─┴─╖ │ │ │ str→int ║
│ │ └──────────────────────┤ · ╟───┴─┐ │ ╘════╤════╝
│ │ ┌─────────╖ ╘═╤═╝ │ ╔═╧═╗ ┌──┴──┐
│ └──────────┤ int→str ╟──────────┘ │ ║ ║ │ ┌───┴───┐
│ ╘═════════╝ │ ╚═══╝ │ │ ┌───╖ │
└───────────────────────────────────────────────────────┘ │ └─┤ × ╟─┘
┌──────────────┐ ╔═══╗ │ ╘═╤═╝
╔════╗ │ ╓───╖ ┌───╖ │ ┌───╢ 0 ║ │ ┌─┴─╖ ╔═══╗
║ −1 ║ └─╢ Ӝ ╟─┤ × ╟──┴──────┐ │ ╚═╤═╝ └───┤ Ӂ ╟─╢ 0 ║
╚═╤══╝ ╙───╜ ╘═╤═╝ │ │ ┌─┴─╖ ╘═╤═╝ ╚═══╝
┌─┴──╖ ┌┐ ┌───╖ ┌┐ ┌─┴──╖ ╔════╗ │ │ ┌─┤ ╟───────┴───────┐
│ << ╟─┤├─┤ ÷ ╟─┤├─┤ << ║ ║ −1 ║ │ │ │ └─┬─╜ ┌─┐ ┌─────┐ │
╘═╤══╝ └┘ ╘═╤═╝ └┘ ╘═╤══╝ ╚═╤══╝ │ │ │ └───┴─┘ │ ┌─┴─╖ │
│ └─┘ └──────┘ │ │ └───────────┘ ┌─┤ ? ╟─┘
└──────────────────────────────┘ ╓───╖ └───────────────┘ ╘═╤═╝
┌───────────╢ Җ ╟────────────┐ │
┌────────────────────────┴───┐ ╙───╜ │
│ ┌─┴────────────────────┐ ┌─┴─╖
┌─┴─╖ ┌─┴─╖ ┌─┴─┤ · ╟──────────────────┐
│ ♯ ║ ┌────────────────────┤ · ╟───────┐ │ ╘═╤═╝ │
╘═╤═╝ │ ╘═╤═╝ │ │ │ ┌───╖ │
┌─────┴───┘ ┌─────────────────┴─┐ ┌───┴───┐ ┌─┴─╖ ┌─┴─╖ ┌─┤ × ╟─┴─┐
│ │ ┌─┴─╖ │ ┌───┴────┤ · ╟─┤ · ╟──────────┤ ╘═╤═╝ │
│ │ ┌───╖ ┌───╖ ┌──┤ · ╟─┘ ┌─┴─┐ ╘═╤═╝ ╘═╤═╝ ┌─┴─╖ │ │
│ ┌────┴─┤ ♭ ╟─┤ × ╟──┘ ╘═╤═╝ │ ┌─┴─╖ ┌───╖└┐ ┌──┴─╖ ┌─┤ · ╟─┘ │
│ │ ╘═══╝ ╘═╤═╝ ┌───╖ │ │ │ × ╟─┤ Ӝ ╟─┴─┤ ÷% ╟─┐ │ ╘═╤═╝ ┌───╖ │
│ ┌─────┴───┐ ┌────┴───┤ Ӝ ╟─┴─┐ │ ╘═╤═╝ ╘═╤═╝ ╘══╤═╝ │ │ └───┤ Ӝ ╟─┘
│ ┌─┴─╖ ┌───╖ │ │ ┌────╖ ╘═╤═╝ │ └───┘ ┌─┴─╖ │ │ └────┐ ╘═╤═╝
│ │ × ╟─┤ Ӝ ╟─┘ └─┤ << ╟───┘ ┌─┴─╖ ┌───────┤ · ╟───┐ │ ┌─┴─╖ ┌───╖ │ │
│ ╘═╤═╝ ╘═╤═╝ ╘══╤═╝ ┌───┤ + ║ │ ╘═╤═╝ ├──┴─┤ · ╟─┤ × ╟─┘ │
└───┤ └────┐ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ ╘═╤═╝ │
┌─┴─╖ ┌────╖ │ ║ 0 ╟─┤ ? ╟─┤ = ║ ┌┴┐ │ ║ 0 ╟─┤ ? ╟─┤ = ║ │ │ ┌────╖ │
│ × ╟─┤ << ╟─┘ ╚═══╝ ╘═╤═╝ ╘═╤═╝ └┬┘ │ ╚═══╝ ╘═╤═╝ ╘═╤═╝ │ └─┤ << ╟─┘
╘═╤═╝ ╘═╤══╝ ┌┐ ┌┐ │ │ └───┘ ┌─┴─╖ ├──────┘ ╘═╤══╝
│ └────┤├──┬──┤├─┘ ├─────────────────┤ · ╟───┘ │
│ └┘┌─┴─╖└┘ │ ┌┐ ┌┐ ╘═╤═╝ ┌┐ ┌┐ │
└────────────┤ · ╟─────────┘ ┌─┤├─┬─┤├─┐ └───┤├─┬─┤├────────────┘
╘═╤═╝ │ └┘ │ └┘ │ └┘ │ └┘
└───────────────┘ │ └────────────┘
Giải thích về phiên bản đầu tiên
Phiên bản đầu tiên mất khoảng một giờ để giải quyết n = 7. Phần sau đây giải thích chủ yếu cách thức phiên bản chậm này hoạt động. Ở phía dưới tôi sẽ giải thích những thay đổi tôi đã thực hiện để có được nó dưới 10 phút.
Chuyến tham quan thành bit
Chương trình này cần bit. Nó cần rất nhiều bit, và nó cần chúng ở tất cả các vị trí thích hợp. Các lập trình viên Funciton có kinh nghiệm đã biết rằng nếu bạn cần n bit, bạn có thể sử dụng công thức
mà trong Funciton có thể được thể hiện là
Khi thực hiện tối ưu hóa hiệu suất của tôi, tôi nhận ra rằng tôi có thể tính toán cùng một giá trị nhanh hơn nhiều bằng cách sử dụng công thức này:
Tôi hy vọng bạn sẽ tha thứ cho tôi rằng tôi đã không cập nhật tất cả đồ họa phương trình trong bài viết này cho phù hợp.
Bây giờ, giả sử bạn không muốn một khối bit liền kề; thực tế, bạn muốn n bit theo chu kỳ đều đặn mỗi bit thứ k , như vậy:
LSB
↓
00000010000001000000100000010000001
└──┬──┘
k
Công thức cho việc này khá đơn giản một khi bạn biết:
Trong mã, hàm Ӝ
lấy các giá trị n và k và tính công thức này.
Theo dõi các số được sử dụng
Có n ² số trong lưới cuối cùng và mỗi số có thể là bất kỳ giá trị n nào. Để theo dõi những số nào được phép trong mỗi ô, chúng tôi duy trì một số bao gồm n bit, trong đó một bit được đặt để chỉ ra rằng một giá trị cụ thể được lấy. Ban đầu con số này là 0, rõ ràng.
Thuật toán bắt đầu ở góc dưới bên phải. Sau khi đoán được số thứ nhất là số 0, chúng ta cần theo dõi thực tế là số 0 không còn được phép trong bất kỳ ô nào dọc theo cùng một hàng, cột và đường chéo:
LSB (example n=5)
↓
10000 00000 00000 00000 10000
00000 10000 00000 00000 10000
00000 00000 10000 00000 10000
00000 00000 00000 10000 10000
10000 10000 10000 10000 10000
↑
MSB
Để kết thúc này, chúng tôi tính toán bốn giá trị sau:
Hàng hiện tại: Chúng ta cần n bit mỗi bit thứ n (một trên mỗi ô), sau đó chuyển nó sang hàng hiện tại r , ghi nhớ mỗi hàng chứa n ² bit:
Cột hiện tại: Chúng ta cần n bit mỗi bit thứ n (một trên mỗi hàng), sau đó chuyển nó sang cột hiện tại c , ghi nhớ mỗi cột chứa n bit:
Chuyển tiếp chéo: Chúng tôi cần n bit mỗi ... (bạn có chú ý không? Nhanh chóng, tìm ra nó!) ... n ( n +1) -th bit (hoàn thành tốt!), Nhưng chỉ khi chúng tôi thực sự vào đường chéo phía trước:
Đường chéo ngược: Hai điều ở đây. Đầu tiên, làm thế nào để chúng ta biết nếu chúng ta đang ở trên đường chéo ngược? Về mặt toán học, điều kiện là c = ( n - 1) - r , giống như c = n + (- r - 1). Này, điều đó có nhắc nhở bạn điều gì không? Đúng vậy, đó là hai phần bù, vì vậy chúng ta có thể sử dụng phủ định bitwise (rất hiệu quả trong Funciton) thay vì giảm dần. Thứ hai, công thức trên giả định rằng chúng ta muốn thiết lập bit quan trọng nhất, nhưng theo đường chéo ngược chúng ta không có, vì vậy chúng ta phải thay đổi nó bằng cách ... bạn có biết không? ... Đúng vậy, n ( n - 1).
Đây cũng là người duy nhất có khả năng chia cho 0 nếu n = 1. Tuy nhiên, Funciton không quan tâm. 0 ÷ 0 chỉ là 0, bạn không biết sao?
Trong mã, hàm Җ
( hàm dưới cùng) lấy n và một chỉ mục (từ đó nó tính r và c bằng cách chia và phần còn lại), tính bốn giá trị này và or
kết hợp chúng với nhau.
Thuật toán brute-force
Thuật toán brute-force được thực hiện bởi Ӂ
(hàm ở trên cùng). Phải mất n (kích thước lưới), chỉ mục (trong đó trong lưới chúng ta hiện đang đặt một số) và lấy (số có n bit cho chúng ta biết số nào chúng ta vẫn có thể đặt trong mỗi ô).
Hàm này trả về một chuỗi các chuỗi. Mỗi chuỗi là một giải pháp đầy đủ cho lưới. Đó là một người giải quyết hoàn chỉnh; nó sẽ trả về tất cả các giải pháp nếu bạn cho phép, nhưng nó trả về chúng như một chuỗi đánh giá lười biếng.
Nếu chỉ mục đã về 0, chúng tôi đã lấp đầy thành công toàn bộ lưới, vì vậy chúng tôi trả về một chuỗi chứa chuỗi trống (một giải pháp duy nhất không bao gồm bất kỳ ô nào). Chuỗi rỗng là 0
và chúng tôi sử dụng hàm thư viện ⌑
để biến chuỗi đó thành một chuỗi phần tử đơn.
Kiểm tra được mô tả dưới cải tiến hiệu suất dưới đây xảy ra ở đây.
Nếu chỉ số chưa đạt đến 0, chúng ta sẽ giảm nó đi 1 để lấy chỉ số mà tại đó chúng ta cần đặt một số (gọi đó là ix ).
Chúng tôi sử dụng ♫
để tạo ra một chuỗi lười biếng chứa các giá trị từ 0 đến n - 1.
Sau đó, chúng tôi sử dụng ɓ
(liên kết đơn âm) với lambda thực hiện theo thứ tự sau:
- Trước tiên hãy xem bit có liên quan được thực hiện để quyết định xem số đó có hợp lệ ở đây hay không. Chúng ta có thể đặt một số i khi và chỉ khi đã lấy & (1 << ( n × ix ) << i ) chưa được đặt. Nếu nó được đặt, trả về
0
(chuỗi trống).
- Sử dụng
Җ
để tính toán các bit tương ứng với hàng, cột và đường chéo hiện tại. Thay đổi nó bởi tôi và sau đó or
nó được thực hiện .
- Gọi đệ quy
Ӂ
để lấy tất cả các giải pháp cho các ô còn lại, chuyển nó qua ix mới được thực hiện và ix giảm dần . Điều này trả về một chuỗi các chuỗi không đầy đủ; mỗi chuỗi có các ký tự ix (lưới được điền vào chỉ mục ix ).
- Sử dụng
ɱ
(bản đồ) để đi qua các giải pháp được tìm thấy và sử dụng ‼
để nối i đến cuối mỗi giải pháp. Nối một dòng mới nếu chỉ số là bội số của n , nếu không thì là khoảng trắng.
Tạo kết quả
Chương trình chính gọi Ӂ
(forcer brute) với n , index = n ² (hãy nhớ rằng chúng ta điền vào lưới ngược) và lấy = 0 (ban đầu không có gì được thực hiện). Nếu kết quả của việc này là một chuỗi trống (không tìm thấy giải pháp), hãy xuất chuỗi trống. Mặt khác, xuất chuỗi đầu tiên trong chuỗi. Lưu ý rằng điều này có nghĩa là nó sẽ chỉ đánh giá phần tử đầu tiên của chuỗi, đó là lý do tại sao người giải không tiếp tục cho đến khi tìm thấy tất cả các giải pháp.
Cải thiện hiệu suất
(Đối với những người đã đọc phiên bản cũ của giải thích: chương trình không còn tạo ra một chuỗi các chuỗi cần được tách riêng thành một chuỗi cho đầu ra; nó chỉ tạo ra một chuỗi các chuỗi trực tiếp. Nhưng đó không phải là cải tiến chính. Nó đến rồi.)
Trên máy của tôi, exe đã biên dịch của phiên bản đầu tiên mất khá nhiều thời gian chính xác là 1 giờ để giải quyết n = 7. Điều này không nằm trong giới hạn thời gian nhất định là 10 phút, vì vậy tôi đã không nghỉ ngơi. (Chà, thực ra, lý do tôi không nghỉ ngơi là vì tôi có ý tưởng này về cách tăng tốc nó một cách ồ ạt.)
Thuật toán như được mô tả ở trên dừng tìm kiếm và quay lui của nó mỗi khi nó gặp một ô trong đó tất cả các bit trong số đã lấy được đặt, chỉ ra rằng không có gì có thể được đưa vào ô này.
Tuy nhiên, thuật toán sẽ tiếp tục lấp đầy lưới một cách vô ích đến ô mà tất cả các bit đó được đặt. Sẽ nhanh hơn nhiều nếu nó có thể dừng ngay khi bất kỳ ô nào được điền đầy đủ đã có tất cả các bit được đặt, điều này cho thấy rằng chúng ta không bao giờ có thể giải quyết phần còn lại của lưới cho dù chúng ta đặt số nào vào nó Nhưng làm thế nào để bạn kiểm tra một cách hiệu quả liệu có bất kỳ ô nào có n bit được đặt mà không đi qua tất cả chúng không?
Thủ thuật bắt đầu bằng cách thêm một bit trên mỗi ô vào số đã lấy . Thay vì những gì đã được hiển thị ở trên, bây giờ nó trông như thế này:
LSB (example n=5)
↓
10000 0 00000 0 00000 0 00000 0 10000 0
00000 0 10000 0 00000 0 00000 0 10000 0
00000 0 00000 0 10000 0 00000 0 10000 0
00000 0 00000 0 00000 0 10000 0 10000 0
10000 0 10000 0 10000 0 10000 0 10000 0
↑
MSB
Thay vì n , bây giờ có n ² ( n + 1) bit trong số này. Hàm điền vào hàng / cột / đường chéo hiện tại đã được thay đổi tương ứng (thực tế, được viết lại hoàn toàn thành trung thực). Mặc dù vậy, hàm đó sẽ vẫn chỉ chứa n bit trên mỗi ô, do đó, bit bổ sung mà chúng ta vừa thêm sẽ luôn như vậy 0
.
Bây giờ, giả sử chúng ta đang thực hiện được một nửa tính toán, chúng ta chỉ cần đặt một 1
ô ở giữa và số được lấy trông giống như thế này:
current
LSB column (example n=5)
↓ ↓
11111 0 10010 0 01101 0 11100 0 11101 0
00011 0 11110 0 01101 0 11101 0 11100 0
11111 0 11110 0[11101 0]11100 0 11100 0 ← current row
11111 0 11111 0 11111 0 11111 0 11111 0
11111 0 11111 0 11111 0 11111 0 11111 0
↑
MSB
Như bạn có thể thấy, ô trên cùng bên trái (chỉ số 0) và ô giữa bên trái (chỉ mục 10) hiện không thể. Làm thế nào để chúng ta xác định hiệu quả nhất điều này?
Xem xét một số trong đó bit thứ 0 của mỗi ô được đặt, nhưng chỉ tối đa cho chỉ mục hiện tại. Một số như vậy rất dễ tính bằng công thức quen thuộc:
Chúng ta sẽ nhận được gì nếu cộng hai số này lại với nhau?
LSB LSB
↓ ↓
11111 0 10010 0 01101 0 11100 0 11101 0 10000 0 10000 0 10000 0 10000 0 10000 0 ╓───╖
00011 0 11110 0 01101 0 11101 0 11100 0 ║ 10000 0 10000 0 10000 0 10000 0 10000 0 ║
11111 0 11110 0 11101 0 11100 0 11100 0 ═══╬═══ 10000 0 10000 0 00000 0 00000 0 00000 0 ═════ ╓─╜
11111 0 11111 0 11111 0 11111 0 11111 0 ║ 00000 0 00000 0 00000 0 00000 0 00000 0 ═════ ╨
11111 0 11111 0 11111 0 11111 0 11111 0 00000 0 00000 0 00000 0 00000 0 00000 0 o
↑ ↑
MSB MSB
Kết quả là:
OMG
↓
00000[1]01010 0 11101 0 00010 0 00011 0
10011 0 00001 0 11101 0 00011 0 00010 0
═════ 00000[1]00001 0 00011 0 11100 0 11100 0
═════ 11111 0 11111 0 11111 0 11111 0 11111 0
11111 0 11111 0 11111 0 11111 0 11111 0
Như bạn có thể thấy, phần bổ sung tràn vào bit bổ sung mà chúng ta đã thêm, nhưng chỉ khi tất cả các bit cho ô đó được đặt! Do đó, tất cả những gì còn lại phải làm là che dấu các bit đó (cùng công thức như trên, nhưng << n ) và kiểm tra xem kết quả có phải là 0 không:
00000[1]01010 0 11101 0 00010 0 00011 0 ╓╖ 00000 1 00000 1 00000 1 00000 1 00000 1 ╓─╖ ╓───╖
10011 0 00001 0 11101 0 00011 0 00010 0 ╓╜╙╖ 00000 1 00000 1 00000 1 00000 1 00000 1 ╓╜ ╙╖ ║
00000[1]00001 0 00011 0 11100 0 11100 0 ╙╥╥╜ 00000 1 00000 1 00000 0 00000 0 00000 0 ═════ ║ ║ ╓─╜
11111 0 11111 0 11111 0 11111 0 11111 0 ╓╜╙╥╜ 00000 0 00000 0 00000 0 00000 0 00000 0 ═════ ╙╖ ╓╜ ╨
11111 0 11111 0 11111 0 11111 0 11111 0 ╙──╨─ 00000 0 00000 0 00000 0 00000 0 00000 0 ╙─╜ o
Nếu nó không bằng 0, lưới là không thể và chúng ta có thể dừng lại.