2013-10-03 2 views
1

Erlang을 처음 사용하고 Sudoku 해결사를 만들려고합니다. 지금까지 나는에 따라 행으로 분할 그건이Erlang의 Sudoku에서 상자 얻기

sudoku() -> [6,7,1,8,2,3,4,9,5,5,4,9,1,7,6,3,2,8,3,2,8,5,4,9,1,6,7,1,3,2,6,5,7,8,4,9,9,8,6,4,1,2,5,7,3,4,5,7,3,9,8,6,1,2,8,9,3,2,6,4,7,5,1,7,1,4,9,3,5,2,8,6,2,6,5,7,8,1,9,3,4]. 

처럼 81 개 정수 (9 × 9)의 목록으로 구성된 입력을 가질 수 list splitting algorithm by stemm :

split_rows(sudoku()). 

반환

[5,4,9,1,7,6,3,2,8], 
    [3,2,8,5,4,9,1,6,7], 
    [1,3,2,6,5,7,8,4,9], 
    [9,8,6,4,1,2,5,7,3], 
    [4,5,7,3,9,8,6,1,2], 
    [8,9,3,2,6,4,7,5,1], 
    [7,1,4,9,3,5,2,8,6], 
    [2,6,5,7,8,1,9,3,4]] 

열을 얻으려면이 행렬을 elegant solution of mpm으로 바꾸십시오.

다음 단계는 9 개의 사각형 상자 목록을 수집하는 것입니다. 그런 다음 해당 목록에 중복 요소가 있는지 확인하여 솔루션이 유효한지 확인할 수 있습니다.

불행하게도 나는, 각 사각형 블록의 아홉 개 숫자를 나타냅니다

[[1],[2],[3], 
[4],[5],[6], 
[7],[8],[9]] 

예를 들어, 어떻게 사각형을 획득하는 명확한 생각이 없다. 그래서이 경우 정사각형은 다음과 같이 보입니다.

[5,4,9, 
3,2,8, 
1,2,2] 

누구나 어떻게 할 수 있습니까?

답변

2

이에 대한 lists:sublist/3를 사용할 수 있습니다

square(X, Y, Side, Board) -> 
    Rows = lists:sublist(Board, (Y-1)*Side + 1, Side), 
    [lists:sublist(Row, (X-1)*Side + 1, Side) || Row <- Rows]. 

그것은 당신이 단지리스트 (단순 목록)를 원하는 경우 목록

1> Board = 
[[6,7,1,8,2,3,4,9,5], 
[5,4,9,1,7,6,3,2,8], 
[3,2,8,5,4,9,1,6,7], 
[1,3,2,6,5,7,8,4,9], 
[9,8,6,4,1,2,5,7,3], 
[4,5,7,3,9,8,6,1,2], 
[8,9,3,2,6,4,7,5,1], 
[7,1,4,9,3,5,2,8,6], 
[2,6,5,7,8,1,9,3,4]]. 

4> so:square(1,1,3,Board). 
[[6,7,1], 
[5,4,9], 
[3,2,8]] 
5> so:square(3,3,3,Board). 
[[7,5,1], 
[2,8,6], 
[9,3,4]] 
6> so:square(2,2,3,Board). 
[[6,5,7], 
[4,1,2], 
[3,9,8]] 
7> so:square(3,2,3,Board). 
[[8,4,9], 
[5,7,3], 
[6,1,2]] 

의 목록을 반환 square/4의 결과에 lists:flatten/1을 사용합니다.

+0

값을 인덱싱하여 튜플 목록을 만들고 사각형 번호를 계산하려고했지만이 방법이 더 좋습니다! 색인은 여전히 ​​유용합니다. 감사! –

+1

['list comprehension'] (http://www.erlang.org/doc/programming_examples/list_comprehensions.html)입니다. 행 - 행은 행의 모든 ​​행에 대한 의미입니다. – zaquest

+1

답장을 보내 주셔서 다시 한번 감사 드리며 매력처럼 작동합니다. 이제 스도쿠 스의 유효성을 확인할 수 있습니다. 불행히도 나는 왜 그것이 작동하는지 모르지만, 나는 그것을 프린트하고 집으로 오는 길에 보게 될 것이다. –