2016-03-20 13 views
0

Google PlayストアでSudokuアプリを検索していましたが、thisアプリが非常に興味深いとわかりました。彼らにはさまざまな難易度があります。私がこのアプリで見つけたのは、入力された番号が正しいかどうかを自動的に切り離すヒントボタンと自動エラーチェックがあることです。今では、入力された数字が正しいかどうかについて同じ仕事をするアルゴリズムを作成する方法を知りたいと思います。どのようにヒントボタンが機能するのでしょうか?Sudokuの各エントリが有効であることを確認する方法

ポールのコメント後に編集:入力値が正しいかどうかを確認する方法がわかりました。残りの問題は、上記のアプリが提供するヒントに似たヒントを提供する方法です。 When I tab hint buttonWhen I press nextenter image description here

PS:この質問は、サイトの建設的でない場合、私に知らせてください。私はこの質問をここや他のstackoverflowコミュニティに置くべきかどうかわからないので、この質問を喜んで削除します。

+0

ただのゲームはその後、入力された値が一致するかどうかをチェックする、配列内のソリューションを保存し、起動する前に、プログラムは、パズルを解く持つ問題はありますか? – Paul

答えて

0

あなたの質問は混乱します。一方で、あなたはスドキの位置が有効かどうかを確認する方法を尋ねますが、この例では、プログラムが数字を置く位置を見つけるのを支援する方法を示しています(あなたのスドクをチェックするのではなく、 。

スクロールをチェックするには、各行/列/正方形の数字が有効であることを確認するだけです。これは、設定されたデータ構造で簡単に達成できます。私はアンドロイド知らないと見て時間を持っていないので、ここでは文字列の配列を受け取り、数独が有効であるかどうかを指示する簡単なPythonのコードです:

from collections import Counter 

def isValidCounter(cnt): 
    del cnt[0] 
    for i in cnt: 
     if cnt[i] > 1: 
      return False 
    return True 

def isValid(arr): 
    M = [[int(i) if i != '.' else 0 for i in line] for line in arr] 

    # rows 
    for i in M: 
     if not isValidCounter(Counter(i)): 
      return False 

    # columns 
    for i in xrange(9): 
     if not isValidCounter(Counter(M[j][i] for j in xrange(9))): 
      return False 

    # squares 
    squares = [ 
     [M[0][i] for i in xrange(0, 3)] + [M[1][i] for i in xrange(0, 3)] + [M[2][i] for i in xrange(0, 3)], 
     [M[0][i] for i in xrange(3, 6)] + [M[1][i] for i in xrange(3, 6)] + [M[2][i] for i in xrange(3, 6)], 
     [M[0][i] for i in xrange(6, 9)] + [M[1][i] for i in xrange(6, 9)] + [M[2][i] for i in xrange(6, 9)], 

     [M[3][i] for i in xrange(0, 3)] + [M[4][i] for i in xrange(0, 3)] + [M[5][i] for i in xrange(0, 3)], 
     [M[3][i] for i in xrange(3, 6)] + [M[4][i] for i in xrange(3, 6)] + [M[5][i] for i in xrange(3, 6)], 
     [M[3][i] for i in xrange(6, 9)] + [M[4][i] for i in xrange(6, 9)] + [M[5][i] for i in xrange(6, 9)], 

     [M[6][i] for i in xrange(0, 3)] + [M[7][i] for i in xrange(0, 3)] + [M[8][i] for i in xrange(0, 3)], 
     [M[6][i] for i in xrange(3, 6)] + [M[7][i] for i in xrange(3, 6)] + [M[8][i] for i in xrange(3, 6)], 
     [M[6][i] for i in xrange(6, 9)] + [M[7][i] for i in xrange(6, 9)] + [M[8][i] for i in xrange(6, 9)] 
    ] 
    for square in squares: 
     if not isValidCounter(Counter(square)): 
      return False 

    return True 

そして、ここでは、この配列がどのように見えるかです:

[ 
    "53..7....", 
    "6..195...", 
    ".98....6.", 
    "8...6...3", 
    "4..8.3..1", 
    "7...2...6", 
    ".6....28.", 
    "...419..5", 
    "....8..79" 
] 
関連する問題