【问题标题】:Trying to write a Sudoku Checker but my loops are not working尝试编写数独检查器,但我的循环不起作用
【发布时间】:2019-09-06 10:48:14
【问题描述】:

我正在尝试编写一个函数 DoneOrNot 传递一个板 (list[list_lines]) 作为参数.如果板子有效返回'完成!',否则返回'再试一次!'

我首先编写了两个从板上提取行和列的函数,然后我继续检查行和列是否有效(我检查每个行和列是否具有从 1 到 9 的所有数字):

def done_or_not(board): 
    rows = getrows(board)
    cols = getrows(board)
    for k in cols:
        for l in range(1,10):
            if l not in k:
                return 'Try again!'
            else:
                return 'Finished!'

    for i in rows:
        for j in range(1,10):
            if j not in i:
                return 'Try again!'
            else:
                return 'Finished!'

def getrows(board):
    rows = [board[i] for i in range(len(board))]
    return rows

def getcols(board):
    columns = [[],[],[],[],[],[],[],[],[]]
    for i in range(9):
        for j in range(9):
            columns[i].append(board[j][i])
    return columns

当我尝试使用以下代码时,我不明白为什么这段代码不起作用:

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

似乎没有执行循环,但是当我仅使用其中一个循环(用于列的循环或用于行的循环)尝试它时,它可以工作!

【问题讨论】:

  • 可能cols = getrows(board) 应该是cols = getcols(board)
  • 顺便说一句,我建议你使用numpy包:board = numpy.array(board),这样会更容易提取一行:board[0, :]一个列:board[:, 0],甚至一个块:@ 987654328@。更好的是,您可以使用board[:3, :3].reshape(9) 将块转换为一维,这意味着所有三行、列和块都表示为与标准一维数组相同,因此您只需要编写一个函数来检查它是否有 9 个不同数字都在 1 到 9 之间

标签: python python-3.x list loops


【解决方案1】:

您在每个 for 循环的早期返回函数,您需要跟踪它是否有效,然后在两个循环之后打印。

而不是

return 'Try again!'

使用类似的东西

valid = false
break

然后在函数的开头将valid 初始化为true,然后您可以删除当前打印出“已完成”的 else 语句。

两个循环结束后,有一个简单的if语句

return "Finished" if valid else "Try again"

【讨论】:

  • .. 还将 getrows 更改为 getcols 以获取 cmets 中提到的 cols
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2011-12-11
  • 2020-08-01
  • 2020-09-07
相关资源
最近更新 更多