최신 정보! 대규모 성능 향상! n = 7은 이제 10 분 안에 완료됩니다! 하단의 설명을 참조하십시오!
이것은 쓰기에 좋은 재미였습니다. 이것은 Funciton으로 작성된이 문제에 대한 무차별 대입 솔버입니다. 일부 사실 :
- STDIN에서 정수를 허용합니다. 정수 다음의 줄 바꿈을 포함하여 불필요한 공백이 있으면 공백이 끊어집니다.
- 0에서 n -1 사이 의 숫자를 사용합니다 (1에서 n은 아님).
- 그리드를 "뒤로"채우므로
3 2 1 0
맨 위 행이 아닌 맨 아래 행이 읽는 솔루션을 얻 습니다 0 1 2 3
.
- n = 1에
0
대해 올바르게 출력합니다 (유일한 솔루션) .
- n = 2 및 n = 3에 대한 빈 출력 .
- exe로 컴파일 할 때 n = 7 (성능 개선 전 약 1 시간 전)에 약 8 분이 걸립니다 . (인터프리터를 사용하여) 컴파일하지 않으면 약 1.5 배의 시간이 걸리므로 컴파일러를 사용하는 것이 좋습니다.
- 개인적인 이정표로서, 의사 코드 언어로 프로그램을 작성하지 않고 전체 Funciton 프로그램을 작성한 것은 이번이 처음입니다. 그래도 실제 C #으로 작성했습니다.
- (그러나 이것이 Funciton에서 무언가의 성능을 크게 향상시키기 위해 처음으로 변경 한 것은 아닙니다. 처음으로 팩토리얼 기능을 사용했습니다. 곱셈의 피연산자 순서를 바꾸는 것은 큰 차이를 가져 왔습니다 곱셈 알고리즘의 작동 방식 궁금한 경우를 대비하여.)
더 이상 고민하지 않고 :
┌────────────────────────────────────┐ ┌─────────────────┐
│ ┌─┴─╖ ╓───╖ ┌─┴─╖ ┌──────┐ │
│ ┌─────────────┤ · ╟─╢ Ӂ ╟─┤ · ╟───┤ │ │
│ │ ╘═╤═╝ ╙─┬─╜ ╘═╤═╝ ┌─┴─╖ │ │
│ │ └─────┴─────┘ │ ♯ ║ │ │
│ ┌─┴─╖ ╘═╤═╝ │ │
│ ┌────────────┤ · ╟───────────────────────────────┴───┐ │ │
┌─┴─╖ ┌─┴─╖ ┌────╖ ╘═╤═╝ ┌──────────┐ ┌────────┐ ┌─┴─╖│ │
│ ♭ ║ │ × ╟───┤ >> ╟───┴───┘ ┌─┴─╖ │ ┌────╖ └─┤ · ╟┴┐ │
╘═╤═╝ ╘═╤═╝ ╘══╤═╝ ┌─────┤ · ╟───────┴─┤ << ╟─┐ ╘═╤═╝ │ │
┌───────┴─────┘ ┌────╖ │ │ ╘═╤═╝ ╘══╤═╝ │ │ │ │
│ ┌─────────┤ >> ╟─┘ │ └───────┐ │ │ │ │ │
│ │ ╘══╤═╝ ┌─┴─╖ ╔═══╗ ┌─┴─╖ ┌┐ │ │ ┌─┴─╖ │ │
│ │ ┌┴┐ ┌───────┤ ♫ ║ ┌─╢ 0 ║ ┌─┤ · ╟─┤├─┤ ├─┤ Ӝ ║ │ │
│ │ ╔═══╗ └┬┘ │ ╘═╤═╝ │ ╚═╤═╝ │ ╘═╤═╝ └┘ │ │ ╘═╤═╝ │ │
│ │ ║ 1 ╟───┬┘ ┌─┴─╖ └───┘ ┌─┴─╖ │ │ │ │ │ ┌─┴─╖ │
│ │ ╚═══╝ ┌─┴─╖ │ ɓ ╟─────────────┤ ? ╟─┘ │ ┌─┴─╖ │ ├─┤ · ╟─┴─┐
│ ├─────────┤ · ╟─┐ ╘═╤═╝ ╘═╤═╝ ┌─┴────┤ + ╟─┘ │ ╘═╤═╝ │
┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ╔═╧═╕ ╔═══╗ ┌───╖ ┌─┴─╖ ┌─┴─╖ ╘═══╝ │ │ │
┌─┤ · ╟─┤ · ╟───┐ └┐ └─╢ ├─╢ 0 ╟─┤ ⌑ ╟─┤ ? ╟─┤ · ╟──────────────┘ │ │
│ ╘═╤═╝ ╘═╤═╝ └───┐ ┌┴┐ ╚═╤═╛ ╚═╤═╝ ╘═══╝ ╘═╤═╝ ╘═╤═╝ │ │
│ │ ┌─┴─╖ ┌───╖ │ └┬┘ ┌─┴─╖ ┌─┘ │ │ │ │
│ ┌─┴───┤ · ╟─┤ Җ ╟─┘ └────┤ ? ╟─┴─┐ ┌─────────────┘ │ │
│ │ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │ │╔════╗╔════╗ │ │
│ │ │ ┌──┴─╖ ┌┐ ┌┐ ┌─┴─╖ ┌─┴─╖ │║ 10 ║║ 32 ║ ┌─────────────────┘ │
│ │ │ │ << ╟─┤├─┬─┤├─┤ · ╟─┤ · ╟─┘╚══╤═╝╚╤═══╝ ┌──┴──┐ │
│ │ │ ╘══╤═╝ └┘ │ └┘ ╘═╤═╝ ╘═╤═╝ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ │
│ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ╔═╧═╕ └─┤ ? ╟─┤ · ╟─┤ % ║ │
│ └─────┤ · ╟─┤ · ╟──┤ Ӂ ╟──┤ ɱ ╟─╢ ├───┐ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │
│ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═══╝ ╚═╤═╛ ┌─┴─╖ ┌─┴─╖ │ └────────────────────┘
│ └─────┤ │ └───┤ ‼ ╟─┤ ‼ ║ │ ┌──────┐
│ │ │ ╘═══╝ ╘═╤═╝ │ │ ┌────┴────╖
│ │ │ ┌─┴─╖ │ │ │ str→int ║
│ │ └──────────────────────┤ · ╟───┴─┐ │ ╘════╤════╝
│ │ ┌─────────╖ ╘═╤═╝ │ ╔═╧═╗ ┌──┴──┐
│ └──────────┤ int→str ╟──────────┘ │ ║ ║ │ ┌───┴───┐
│ ╘═════════╝ │ ╚═══╝ │ │ ┌───╖ │
└───────────────────────────────────────────────────────┘ │ └─┤ × ╟─┘
┌──────────────┐ ╔═══╗ │ ╘═╤═╝
╔════╗ │ ╓───╖ ┌───╖ │ ┌───╢ 0 ║ │ ┌─┴─╖ ╔═══╗
║ −1 ║ └─╢ Ӝ ╟─┤ × ╟──┴──────┐ │ ╚═╤═╝ └───┤ Ӂ ╟─╢ 0 ║
╚═╤══╝ ╙───╜ ╘═╤═╝ │ │ ┌─┴─╖ ╘═╤═╝ ╚═══╝
┌─┴──╖ ┌┐ ┌───╖ ┌┐ ┌─┴──╖ ╔════╗ │ │ ┌─┤ ╟───────┴───────┐
│ << ╟─┤├─┤ ÷ ╟─┤├─┤ << ║ ║ −1 ║ │ │ │ └─┬─╜ ┌─┐ ┌─────┐ │
╘═╤══╝ └┘ ╘═╤═╝ └┘ ╘═╤══╝ ╚═╤══╝ │ │ │ └───┴─┘ │ ┌─┴─╖ │
│ └─┘ └──────┘ │ │ └───────────┘ ┌─┤ ? ╟─┘
└──────────────────────────────┘ ╓───╖ └───────────────┘ ╘═╤═╝
┌───────────╢ Җ ╟────────────┐ │
┌────────────────────────┴───┐ ╙───╜ │
│ ┌─┴────────────────────┐ ┌─┴─╖
┌─┴─╖ ┌─┴─╖ ┌─┴─┤ · ╟──────────────────┐
│ ♯ ║ ┌────────────────────┤ · ╟───────┐ │ ╘═╤═╝ │
╘═╤═╝ │ ╘═╤═╝ │ │ │ ┌───╖ │
┌─────┴───┘ ┌─────────────────┴─┐ ┌───┴───┐ ┌─┴─╖ ┌─┴─╖ ┌─┤ × ╟─┴─┐
│ │ ┌─┴─╖ │ ┌───┴────┤ · ╟─┤ · ╟──────────┤ ╘═╤═╝ │
│ │ ┌───╖ ┌───╖ ┌──┤ · ╟─┘ ┌─┴─┐ ╘═╤═╝ ╘═╤═╝ ┌─┴─╖ │ │
│ ┌────┴─┤ ♭ ╟─┤ × ╟──┘ ╘═╤═╝ │ ┌─┴─╖ ┌───╖└┐ ┌──┴─╖ ┌─┤ · ╟─┘ │
│ │ ╘═══╝ ╘═╤═╝ ┌───╖ │ │ │ × ╟─┤ Ӝ ╟─┴─┤ ÷% ╟─┐ │ ╘═╤═╝ ┌───╖ │
│ ┌─────┴───┐ ┌────┴───┤ Ӝ ╟─┴─┐ │ ╘═╤═╝ ╘═╤═╝ ╘══╤═╝ │ │ └───┤ Ӝ ╟─┘
│ ┌─┴─╖ ┌───╖ │ │ ┌────╖ ╘═╤═╝ │ └───┘ ┌─┴─╖ │ │ └────┐ ╘═╤═╝
│ │ × ╟─┤ Ӝ ╟─┘ └─┤ << ╟───┘ ┌─┴─╖ ┌───────┤ · ╟───┐ │ ┌─┴─╖ ┌───╖ │ │
│ ╘═╤═╝ ╘═╤═╝ ╘══╤═╝ ┌───┤ + ║ │ ╘═╤═╝ ├──┴─┤ · ╟─┤ × ╟─┘ │
└───┤ └────┐ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ ╘═╤═╝ │
┌─┴─╖ ┌────╖ │ ║ 0 ╟─┤ ? ╟─┤ = ║ ┌┴┐ │ ║ 0 ╟─┤ ? ╟─┤ = ║ │ │ ┌────╖ │
│ × ╟─┤ << ╟─┘ ╚═══╝ ╘═╤═╝ ╘═╤═╝ └┬┘ │ ╚═══╝ ╘═╤═╝ ╘═╤═╝ │ └─┤ << ╟─┘
╘═╤═╝ ╘═╤══╝ ┌┐ ┌┐ │ │ └───┘ ┌─┴─╖ ├──────┘ ╘═╤══╝
│ └────┤├──┬──┤├─┘ ├─────────────────┤ · ╟───┘ │
│ └┘┌─┴─╖└┘ │ ┌┐ ┌┐ ╘═╤═╝ ┌┐ ┌┐ │
└────────────┤ · ╟─────────┘ ┌─┤├─┬─┤├─┐ └───┤├─┬─┤├────────────┘
╘═╤═╝ │ └┘ │ └┘ │ └┘ │ └┘
└───────────────┘ │ └────────────┘
첫 번째 버전의 설명
첫 번째 버전은 n = 7 을 해결하는 데 약 1 시간이 걸렸습니다 . 다음은이 느린 버전의 작동 방식을 설명합니다. 하단에는 10 분 미만으로 변경 한 내용이 설명되어 있습니다.
비트 여행
이 프로그램에는 비트가 필요합니다. 많은 비트가 필요하며 모든 올바른 위치에 비트가 필요합니다. 숙련 된 Funciton 프로그래머는 이미 n 비트 가 필요한 경우 공식을 사용할 수 있음을 알고 있습니다.
Funciton에서 다음과 같이 표현 될 수 있습니다.
성능 최적화를 수행 할 때이 공식을 사용하여 동일한 값을 훨씬 빠르게 계산할 수있었습니다.
나는이 게시물의 모든 방정식 그래픽을 그에 따라 업데이트하지 않았다는 것을 용서하기를 바랍니다.
이제 연속적인 비트 블록을 원하지 않는다고 가정 해 봅시다. 실제로 k 번째 비트 마다 일정한 간격으로 n 비트 를 원합니다 .
LSB
↓
00000010000001000000100000010000001
└──┬──┘
k
이것에 대한 공식은 일단 알면 매우 간단합니다.
코드에서 함수 Ӝ
는 값 n 과 k를 가져 와서이 공식을 계산합니다.
사용 된 숫자 추적
최종 그리드 에는 n ² 개의 숫자가 있으며 각 숫자는 n 개의 가능한 값 중 하나 일 수 있습니다. 각 셀에서 어떤 숫자가 허용되는지 추적하기 위해, 우리는 n ³ 비트로 구성된 숫자를 유지하는데 , 여기서 특정 값이 취해 졌음을 나타내는 비트가 설정됩니다. 처음에는이 숫자가 0입니다.
알고리즘은 오른쪽 하단에서 시작합니다. 첫 번째 숫자를 "추측"한 후에는 동일한 행, 열 및 대각선을 따라 어떤 셀에서도 0이 더 이상 허용되지 않는다는 사실을 추적해야합니다.
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
이를 위해 다음 네 가지 값을 계산합니다.
현재 행 : 우리는 n 번째 비트마다 n 비트 가 필요 하며 (셀당 1 개), 모든 행에 n ² 비트 가 포함되어 있음을 기억 하여 현재 행 r 로 이동합니다 .
현재 열 : 우리는 n ² 번째 비트마다 n 비트 가 필요 하며 (행 당 하나씩) 모든 열에 n 비트 가 포함되어 있음을 기억 하여 현재 열 c 로 이동하십시오 .
앞으로 대각선 : 우리는 필요가 N 모든 비트 ... (?! 당신이 관심 빠른, 그림을 지불 않았다) N ( n은 우리가 실제로 +1) 번째 비트 (! 잘 했어), 그러나있어 경우에만 전방 대각선 :
뒤로 대각선 : 여기 두 가지. 첫째, 우리가 후방 대각선에 있는지 어떻게 알 수 있습니까? 수학적으로 조건은 c = ( n -1) -r 이며 c = n + (− r -1)와 같습니다. 이봐, 뭔가 생각나? 맞습니다, 그것은 2의 보수이므로, 우리는 감소 대신 비트 단위 부정 (Funciton에서 매우 효율적)을 사용할 수 있습니다. 둘째, 위의 공식은 우리가 최하위 비트가 세트가되고 싶어한다고 가정하지만, 우리는 당신이 알고에 의해 ... 그것을 이동해야하므로 역방향 대각선에서 우리가하지? ... 그건 바로, N ( n -1).
이것은 또한 n = 1 인 경우 잠재적으로 0으로 나눌 수있는 유일한 것입니다 . 그러나 Funciton은 상관하지 않습니다. 0 ÷ 0은 0에 불과합니다.
코드에서 함수 Җ
(하단)는 n 과 인덱스 ( 분할 및 나머지로 r 과 c 를 계산 하는 인덱스 )를 가져 와서이 4 개의 값을 계산 or
하고 함께 s합니다.
무차별 알고리즘
무차별 알고리즘은 Ӂ
(상단의 기능)에 의해 구현됩니다 . 그것은 소요 N (격자 크기), 인덱스 (그리드에 우리가 현재 숫자를 배치하고), 및 촬영 (와 수를 n은 우리에게 어떤 숫자를 말하는 ³ 비트 우리가 할 수있는 각 셀에서 여전히 위).
이 함수는 일련의 문자열을 반환합니다. 각 문자열은 그리드에 대한 완전한 솔루션입니다. 완전한 솔버입니다. 허용하면 모든 솔루션을 반환하지만 지연 평가 시퀀스로 반환합니다.
경우 지수가 0에 도달 한 우리는 빈 문자열을 포함하는 순서 (단일 솔루션을 그 세포의 표지 없음) 반환 그래서, 우리는 성공적으로 전체 그리드를 작성했습니다. 빈 문자열은입니다 0
. 라이브러리 함수 ⌑
를 사용하여 단일 요소 시퀀스로 바꿉니다.
아래 성능 개선에 설명 된 점검이 여기에서 발생합니다.
인덱스 가 아직 0에 도달하지 않은 경우 숫자를 배치해야하는 인덱스를 얻기 위해 인덱스를 1 씩 줄입니다 ( ix 호출 ).
♫
0에서 n -1 사이의 값을 포함하는 지연 시퀀스를 생성하는 데 사용 합니다 .
그런 ɓ
다음 순서대로 다음을 수행하는 람다와 함께 (모 노드 바인드)를 사용합니다.
- 의 관련 비트에서 먼저 살펴 찍은 번호가 여기 여부 유효한지 여부를 결정합니다. 우리는 다수 배치 할 수 있습니다 난 경우에만 촬영 & (1 << ( N × IX ) << 내가 ) 아직 설정되지 않습니다. 설정된 경우
0
(빈 시퀀스)를 반환 합니다.
Җ
현재 행, 열 및 대각선에 해당하는 비트를 계산하는 데 사용 합니다. 하여 시프트 난 다음 or
그것을로 촬영 .
- 재귀 호출
Ӂ
그것을 새로운 전달, 나머지 셀에 대한 모든 솔루션을 검색하기 위해 촬영 과 감소 IX를 . 불완전한 문자열 시퀀스를 반환합니다. 각 문자열에는 ix 개의 문자가 있습니다 (그리드는 인덱스 ix 까지 채워짐 ).
- 사용
ɱ
(지도) thusly 히있는 솔루션을 통해 이동 및 사용에 ‼
연결하는 난을 각각의 끝에. index 가 n 의 배수 이면 개행을 추가하고 , 그렇지 않으면 공백을 추가하십시오.
결과 생성
주요 프로그램 호출 Ӂ
과 (짐승의 강제 자) N , 인덱스 = N ²가와 (우리는 그리드 뒤쪽을 채우기 기억) 촬영 = 0 (처음에 아무것도 수행되지 않습니다). 이 결과가 빈 시퀀스 인 경우 (솔루션이 없음) 빈 문자열을 출력하십시오. 그렇지 않으면 순서에서 첫 번째 문자열을 출력하십시오. 이는 시퀀스의 첫 번째 요소 만 평가한다는 것을 의미하므로 솔버가 모든 솔루션을 찾을 때까지 계속되지 않습니다.
성능 향상
(이전 버전의 설명을 이미 읽은 사람들을 위해 : 프로그램은 더 이상 출력을 위해 문자열로 개별적으로 전환해야하는 시퀀스 시퀀스를 더 이상 생성하지 않고 단지 문자열 시퀀스를 직접 생성합니다. 그러나 이것이 주요 개선 사항은 아니 었습니다.
내 컴퓨터에서 첫 번째 버전의 컴파일 된 exe는 n = 7 을 해결하는 데 거의 정확히 1 시간이 걸렸습니다 . 이는 주어진 시간 제한 10 분이 아니므로 쉬지 않았습니다. (실제로, 내가 휴식을 취하지 않은 이유는 그것이 어떻게 속도를 높이는 지에 대한 아이디어를 가지고 있었기 때문입니다.)
위에서 설명한 알고리즘은 취한 숫자 의 모든 비트 가 설정된 셀을 발견 할 때마다 검색을 중지하고 역 추적하므로이 셀에 아무것도 넣을 수 없음을 나타냅니다.
그러나 알고리즘은 그리드 를 모든 비트가 설정된 셀 까지 계속 쓸데없이 채 웁니다 . 아직 채워 지지 않은 셀에 이미 모든 비트가 설정 되어 있으면 중지 할 수 있다면 훨씬 빠를 것 입니다. 이는 이미 어떤 숫자를 입력하더라도 그리드의 나머지 부분을 해결할 수 없음을 나타냅니다. 그것. 그러나 모든 셀을 거치지 않고 셀에 n 비트가 설정 되어 있는지 어떻게 효율적으로 확인 합니까?
트릭은 셀당 단일 비트를 취한 숫자 에 추가하여 시작합니다 . 위에 표시된 것 대신 이제 다음과 같습니다.
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
n ³ 대신 이 숫자에 n ² ( n + 1) 비트가 있습니다. 현재 행 / 열 / 대각선을 채우는 기능이 그에 따라 변경되었습니다 (실제로 완전히 정직하도록 다시 작성). 이 함수는 여전히 셀당 n 비트 만 채우 므로 방금 추가 한 추가 비트는 항상입니다 0
.
이제 우리는 계산 1
의 중간 단계 에 있고 중간 셀에 방금 배치 했으며 촬영 한 숫자는 다음과 같습니다.
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
보다시피 왼쪽 상단 셀 (인덱스 0)과 왼쪽 중앙 셀 (인덱스 10)은 불가능합니다. 우리는 이것을 어떻게 가장 효율적으로 결정합니까?
각 셀의 0 번째 비트가 설정되었지만 현재 인덱스까지만 설정된 숫자를 고려하십시오. 이러한 수는 익숙한 공식을 사용하여 쉽게 계산할 수 있습니다.
이 두 숫자를 더하면 어떻게 되나요?
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
결과는 다음과 같습니다.
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
보시다시피, 추가는 추가 한 여분의 비트로 넘치지 만 해당 셀의 모든 비트가 설정된 경우에만 추가됩니다! 따라서 남은 것은 비트를 마스킹하고 (위와 같은 식이지만 << n ) 결과가 0인지 확인하는 것입니다.
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
그것이 0이 아니면 그리드는 불가능하며 우리는 멈출 수 있습니다.
- n = 4 ~ 7의솔루션 및 실행 시간을 보여주는 스크린 샷