2012-03-13 6 views
1

나는 스도쿠 생성기가있다. 내 알고리즘은 다음과 같습니다LINQ 대각선 스도쿠 필러

  1. 가 유효한 채워진 9 × 9 격자를 만들 수와 전체 스도쿠 그리드를 입력합니다.
  2. 특정 숫자를 제거하십시오.
  3. 해결할 수 있는지 확인하십시오.
  4. 사용 된 기술의 난이도에 따라 인간의 풀기 기술 및 속도 난이도 구현으로이를 해결하십시오.

문제는 내 무력 알고리즘은 일반 스도쿠를 위해 완벽하게 작동 단계에서,하지만 난 대각선 스도쿠를 만들려고 할 때에 발생 시간 증가 (그리드의 대각선이 각각도 고유 한 번호가 필요) 의사록. 이것은 받아 들일 수 없다.

그래서 좋은 해결책은 linq를 사용하여 그리드를 채우는 것입니다.

내 생각은 다음과 같습니다 가능한 모든 세포와 값의

  1. 만들기 모음 (81 개 위치, 9 개 가능한 값 각각).
  2. 지금과 같은 queryes의 질의의 일종 만들 : 가능한 모든 세포에서

    • 을, 각각의 위치가 정확히 한 번만 존재한다. (예를 들어, 한 번, 한 번 세포 1,1 0,0 셀).
    • 각 셀 값 (1-9)
    • 반환 조합마다

에게 랜덤이어야한다 (셀 대각선 상에있는 경우 또는 대각선)의 행 셀과 사각형에서 고유해야 나는 더 나은 해결책이 있다고 확신한다. 그러나 나는 아직 보지 못했다. linq을 가진 나의 기술은 상당히 제한되어 있으므로, 나는 올바른 방향으로 나를 가리켜 주신 것에 매우 감사 할 것이다. 고맙습니다.

+2

Linq는이 알고리즘을 빠르게하지 않습니다. Linq는 주로 코드 작성을보다 편리하게 만들어주는 함수 모음입니다. 이러한 편의성은 (일반적으로 IEnumerable에 적용되기 때문에) 일반성 때문에 성능 비용이 발생합니다. (알고리즘을 다시 작성하고 싶지 않다면 좀 더 효율적인 방법입니다.) 알고리즘을 10 배 병렬 처리하는 것이 좋습니다. 방법에 대한이 MSDN 도움말을 확인하십시오. http://msdn.microsoft.com/en-us/library/dd460720.aspx –

+0

+1 잘 평행 할 수있는 문제처럼 보입니다. 사실 때로는 linq가 결코 다루지 않을 다양한 문제를 마술처럼 해결하는 것으로 생각됩니다. 하지만 성능 비용이 항상 사실 인 것은 아닙니다. 예를 들어, Except()와 같은 집합 연산은 직접 코딩 된 중첩 된 foreach 루프 (내가 할 때 :)입니다.). –

+0

Vojtech, [codereview] (http://codereview.stackexchange.com/faq)에서 코드를 공유하고 싶을 수 있습니다. –

답변

0

당신은 실제로 당신이이 문서를 통해 머리를해야 C#으로 스도쿠를 구현하는 방법을보기 위해 찾는 경우 : http://www.codeproject.com/Articles/11983/Sudoku-Solver-and-Generator

+0

저는 이미 솔버와 생성기를 구현했습니다.이 특정 메서드를 최적화하기 만하면됩니다. –

+0

당신이 적절한 발전기를 가지고 있다면, 당신은 해결할 수있는 스도쿠를 생성하는데 짧은 시간이 걸릴 것입니다. 그 후에 당신이 설명하고 어려움을 평가할 때 몇 가지 숫자를 제거 할 수 있어야합니다. 행이나 대각선에서 숫자를 제거하십시오. 실제로 알고리즘은 차이를 만들어서는 안되며, 숫자가 누락 된 것입니다. – ntziolis