数独游戏

时间:2015-12-24 22:55:53

标签: python algorithm sudoku

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.   
  3. 8 7 6 5 4 3 2 1 9
  4.   
  5. 7 6 5 4 3 2 1 9 8
  6.   
  7. 6 5 4 3 2 1 9 8 7
  8.   
  9. 5 4 3 2 1 9 8 7 6
  10.   
  11. 4 3 2 1 9 8 7 6 5
  12.   
  13. 3 2 1 9 8 7 6 5 4
  14.   
  15. 2 1 9 8 7 6 5 4 3
  16.   
  17. 1 9 8 7 6 5 4 3 2
  18.   

但我无法弄明白为什么只是打印:

  
      
  1. 9 8 8 8 8 8 8 8 8
  2.   
  3. 8 9 9 9 9 9 9 9 9
  4.   
  5. 8 9 9 9 9 9 9 9 9
  6.   
  7. 8 9 9 9 9 9 9 9 9
  8.   
  9. 8 9 9 9 9 9 9 9 9
  10.   
  11. 8 9 9 9 9 9 9 9 9
  12.   
  13. 8 9 9 9 9 9 9 9 9
  14.   
  15. 8 9 9 9 9 9 9 9 9
  16.   
  17. 8 9 9 9 9 9 9 9 9
  18.   

你知道为什么我无法实现我的目标吗?

2 个答案:

答案 0 :(得分:2)

在搜索功能中使用带有for循环的else。这样,只有在没有迭代返回中断时才返回1。你甚至可以在for循环后简单地返回1。

tf.train.AdamOptimizer

或者只是在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;
    else:
        return 1;

答案 1 :(得分:1)

您可以使用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))

或使用print作为函数:

# needed for python2
from __future__ import print_function

def print_map(sudoku_map):
    print(*sudoku_map, sep="\n")