代码之家  ›  专栏  ›  技术社区  ›  ihsancemil

带python的数独

  •  2
  • ihsancemil  · 技术社区  · 9 年前
    def print_map(sudoku_map):
        for line in sudoku_map:
            print(line)
            print("\n") 
    
    #it will determine whether there is a same a in row or not
    def search_row(sudoku_map_search, a, row):
        for i in range(9):
            if sudoku_map_search[row][i] == a:
                return 0;
            else:
                return 1;
    
    #it will determine whether there is a same a in column or not
    def search_column(sudoku_map_search, a, column):
        for b in range(9):
            if sudoku_map_search[b][column] == a:
                return 0;
            else:
                return 1;
    
    sudoku_map = [
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0]
    ];
    
    for row in range(9):
        for column in range(9):
            #if block is empty loop will place a number;
            if sudoku_map[row][column]==0:
                #a will be a number which will try all the numbers between 0-10 for blank places
                for a in range(1,10):
                    if search_row(sudoku_map, a ,row)==1 and search_column(sudoku_map, a, column)==1:
                        sudoku_map[row][column]= a
    
    print_map(sudoku_map)
    

    我打算打印一张地图,它看起来像:

    1. 9 8 7 6 5 4 3 2 1
    2. 8 7 6 5 4 3 2 1 9
    3. 7 6 5 4 3 2 1 9 8
    4. 6 5 4 3 2 1 9 8 7
    5. 5 4 3 2 1 9 8 7 6
    6. 4 3 2 1 9 8 7 6 5
    7. 3 2 1 9 8 7 6 5 4
    8. 2 1 9 8 7 6 5 4 3
    9. 1 9 8 7 6 5 4 3 2

    但我想不通为什么它只是打印:

    1. 9 8 8 8 8 8 8 8 8
    2. 8 9 9 9 9 9 9 9 9
    3. 8 9 9 9 9 9 9 9 9
    4. 8 9 9 9 9 9 9 9 9
    5. 8 9 9 9 9 9 9 9 9
    6. 8 9 9 9 9 9 9 9 9
    7. 8 9 9 9 9 9 9 9 9
    8. 8 9 9 9 9 9 9 9 9
    9. 8 9 9 9 9 9 9 9 9

    你知道我为什么达不到目标吗?

    2 回复  |  直到 9 年前
        1
  •  2
  •   kilojoules    9 年前

    在搜索函数中使用else和for循环。这样,只有在没有迭代返回中断时才返回1。您甚至可以在for循环后返回1。

    #it will determine whether there is a same a in row or not
    def search_row(sudoku_map_search, a, row):
        for i in range(9):
            if sudoku_map_search[row][i] == a:
                return 0;
        else:
            return 1;
    

    或者只在for循环后返回1。只有在没有迭代成功时才会返回1。

    #it will determine whether there is a same a in row or not
    def search_row(sudoku_map_search, a, row):
        for i in range(9):
            if sudoku_map_search[row][i] == a:
                return 0;
        return 1;
    
        2
  •  1
  •   Padraic Cunningham    9 年前

    您可以使用 生成器表达式 使用 any 它将返回1或0,即True或False。您的代码看起来像是在尝试编写c而不是python,在python中,您可以迭代列表的元素而不需要索引,并且不需要分号。

    您的功能可以简化为:

    def search_row(sudoku_map_search, a, row):
        return any(ele == a for ele in sudoku_map_search[row])
    

    any 懒洋洋地评估任何 ele == a 为True,如果未找到匹配项,则只返回False。

    要检查是否存在匹配项,只需:

     if search_row(sudoku_map, a ,row):
         sudoku_map[row][column] = a
    

    您不需要使用 == .

    您还可以使用 str.join :

    def print_map(sudoku_map):
        print("\n".join(sudoku_map))
    

    或使用打印功能:

    # needed for python2
    from __future__ import print_function
    
    def print_map(sudoku_map):
        print(*sudoku_map, sep="\n")