1

PythonでCISクラスの割り当てに取り組んでいます。数独チェッカーをコーディングする必要があります。9x9のボードでは、明らかに各行、列、3x3の正方形に重複がないかチェックする必要があります。私は3x3の正方形で数字をチェックする方法のアイデアに少し固執しています。以下は、各行と列をチェックするための私のコードです。誰かがアウトラインやアプローチを少し手伝ってくれるなら、3x3の正方形をチェックするための何かが素晴らしいでしょう!

self.columns = [ ]
     for col in range(9):
        col_tiles = [ ]
        self.columns.append(col_tiles)
        for row in range(9):
            col_tiles.append(self.tiles[row][col])
self.squares = [ ]
for col in range(1, 10, 3):
        for row in range(1, 10, 3):
            square_tiles = [ ]
            self.squares.append(square_tiles)
            for x in range(3):
                for y in range(3):
                    square_tiles.append(self.tiles[x][y])
4

6 に答える 6

2

これは、データを読み取り、必要に応じて構造化する自由があることを前提としています。行/列/3x3グリッドごとに1〜9の一意の値のセットが必要なので、1つの方法は、setまたはリストの比較を使用することです(setここではわかりやすくするために使用します)。1から9までの数に等しいセットを作成すると、他のすべてのグループを比較できるポイントが得られます。このような構造を想定します(ここから):

In [1]: r1 = [9,3,2,5,4,8,1,7,6]

In [2]: r2 = [1,8,7,9,2,6,5,4,3]

In [3]: r3 = [5,4,6,3,7,1,2,8,9]

# Continues....

ここで、各行はデータの完全な行を表します。次に、最初の3行を表すデータのセクションを作成し、1つのグリッドを引き出して、内容をセットと比較します。

In [4]: sec1 = [r1, r2, r3]

In [5]: nums = set(range(1, 10))

In [6]: nums == set(n for row in sec1 for n in row[:3])
Out[6]: True

これは最初の3行を繰り返し、それらの各行の最初の3つの要素を返します。より良い視覚を得るために、これはfor解読を少し簡単にするための同等の-loopコードです:

result = set()
for row in sec1:
    for n in row[:3]:
      result.add(n)

私たちの数字のセットには1から9までのすべてが含まれているので、それが有効であることがわかります。2番目に移動するには、row[:3]to row[3:6](およびrow[6:9]その後)の範囲を指定します。次に、次の2つのセクションでもこれを処理する必要があります。これをより動的な構造でラップする方法についてはお任せします(3の倍数に注意してください)が、うまくいけば、これで始められます:)

于 2012-11-16T05:28:17.933 に答える
1

アルゴリズムを思い付くのに問題があるときはいつでも、「問題を解決できる唯一の方法がコンピューターによるものだったとしたら、これを手動で解決するにはどうすればよいか」と自問してください。

つまり、左上の3x3グリッドを確認するように依頼した場合、目は左上隅に移動して数値を合計します。しかし、私が言った場合、左上の3x3グリッドを確認し、実際にボードを提供しなかった場合は、「OK、左上の3x3グリッドを提供してください」と言うでしょう。

そして、私は「どうやって?」と言うでしょう。

そして、「タイルに行と列の番号が付けられていると想像してみてください。タイルをスポット(0,0)、(0,1)、(0,2)、(1,0)、(1、 1)、(1,2)、(2,0)、(2,1)、および(2,2)」

それは役に立ちますか?

于 2012-11-16T05:18:04.863 に答える
0

これが私がすることです:3つの辞書を作成します。1つは行用、1つは列用、もう1つは3x3の正方形用です。

数独パズルの各要素をループしながら、行と列を追跡し(些細なこと)、ifステートメントを使用して現在の3x3の正方形を追跡します(もう少し複雑です)

次に、各要素を対応する行、列、および3x3の正方形の辞書に送信し、最後に比較します。

このように、各要素を1回だけ検査する必要があります。

編集:また、setおそらく役立つでしょう

于 2012-11-16T05:13:01.007 に答える
0

この関数は実行します。「サンプル」はランダム性を与えるので、これを実行するたびに異なるものが得られます。

from random import sample
def generate_sudoku_checker():
    random_list = sample([1,2,3,4,5,6,7,8,9],9)
    random_list = random_list + random_list[:9]
    for i in range(3):
        for j in range(3):
            print(random_list[i+j*3:i+j*3+9])
于 2014-02-28T09:33:52.210 に答える
0

これに対する私の解決策は次のとおりです。

機能:

def check_sudoku(lis):
    n = len(lis)
    digit = 1  #start from one
    while (digit<=n):
        i=0
        while i<n:  # go through each row and column
            row_count=0
            column_count=0
            j=0
            while j < n: # for each entry in the row / column
                if lis[i][j] == digit: # check row count
                    row_count = row_count+1
                if lis[j][i]== digit :
                   column_count = column_count+1

             j=j+1
           if row_count !=1 or column_count!=1:
             return False
           i=i+1 # next row/column
        digit = digit+1 #next digit
return True
于 2018-03-27T13:36:28.097 に答える
0

パーティーに遅れましたが、これは私のために働きました:

def insert_sudoku():
 puzzle = []
 for i in range(9):
     print("You've entered", len(puzzle), "rows so far")
     row = input("Enter a row")
     if len(row) < 9:
         print("Not enough numbers on this row")
         return insert_sudoku()
     elif len(row) > 9:
         print("Too many numbers. Try again!")
         return insert_sudoku()

    try:
        row = [int(dig) for dig in row]
        puzzle.append(row)
    except:
        print("Whoops, looks like you didn't enter only numbers somewhere. Try again!")
        return insert_sudoku()

validate_entries(puzzle)

def validate_entries(puzzle):

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

 b1, b2, b3, b4, b5, b6, b7, b8, b9 = [], [], [], [], [], [], [], [], []

 for i in range(9):
    z = []
    for x in range(9):
        z.append(puzzle[i][x])
    puzzle.append(z)

 for i in range(3):
    b1 += (puzzle[i][:3])
    b4 += (puzzle[i][3:6])
    b7 += (puzzle[i][6:])

 for i in range(3,6):
    b2 += (puzzle[i][:3])
    b5 += (puzzle[i][3:6])
    b8 += (puzzle[i][6:])

 for i in range(6,9):
    b3 += (puzzle[i][:3])
    b6 += (puzzle[i][3:6])
    b9 += (puzzle[i][6:])

 puzzle.append(b1)
 puzzle.append(b2)
 puzzle.append(b3)
 puzzle.append(b4)
 puzzle.append(b5)
 puzzle.append(b6)
 puzzle.append(b7)
 puzzle.append(b8)
 puzzle.append(b9)

 for iter in puzzle:
     if sorted(iter) != check:
         print("No")
         return

     print("Yes")

 insert_sudoku()

この記事に触発された

編集:インデントは、コードのコピーと貼り付けから外れている可能性があります。

于 2021-03-30T22:37:44.813 に答える