【问题标题】:while loop will not breakwhile 循环不会中断
【发布时间】:2013-11-01 01:56:33
【问题描述】:

我有一个不会中断的 while 循环。我添加了一个冗余条件以使其中断,但这也不起作用。它应该遍历一个二维数组,看看它是否可以在那个位置放置一个特定维度的块。 Block 是一个列表,而 box 是一个二维列表。这是整个程序。有问题的函数是fillBox

def makeBox(dim):
    box = [[0 for x in range(0, dim)] for y in range(0, dim)]
    return box
def printBox(lst):
    for x in lst:
        print(x)
    print()
def isSpaceFree(box, row, col, block):
    isFree = True
    if block > 1:
        if row+block-1 < len(box) and col+block-1 < len(box):
            for x in range(row,row+block):
                for y in range(col, col+block):
                    if box[x][y] != 0:
                        isFree = False
        else:
            isFree = False
    elif block == 1:
            if box[row][col] == 0:
                isFree = True
            else:
                isFree = False
    return isFree
def fillSpace(block, row, col, box):
    if block > 1:
        for x in range(row, row + block):
            for y in range(col, col + block):
                box[x][y] = block
    if block == 1:
        box[row][col] = block
    printBox(box)
def fillBox(block, box):
    row = 0
    col = 0
    while len(block) > 0:
        if len(block) == 0:
            break
        if row == len(block):
            col = 0
            row = 0
            block.pop(0)
        if col == len(block):
            col = 0
            row += 1
        if isSpaceFree(box, row, col, block[0]):
           fillSpace(block[0], row, col, box)
           block.pop(0)
            row = 0
            col = 0
            continue
        col += 1
def main():
    dim = int(input("Enter box dimension: "))
    file = open(input("Block File: "))
    blocks = []
    for x in file:
        blocks = x.split()
    for x in range(0,len(blocks)):
        blocks[x] = int(blocks[x])
    blocks.sort(reverse=True)
    box = makeBox(dim)
    fillBox(blocks, box)
    printBox(box)
main()

【问题讨论】:

  • 欢迎来到 Stack Overflow!你应该尝试缩小你的问题/问题并粘贴更少的代码
  • @CameronSparr 几分钟前他在另一个问题中做了。不知道他为什么删除它。
  • 我被要求发布更多代码,但我不知道该放多少,所以我全部给了。这是一个循环问题,它不会中断。阻止列表为空并抛出索引越界异常。
  • 如果您没有调试器来单步执行代码,请添加print 语句以了解循环进行时发生的情况。很明显,block 永远不会变空(为什么这么明显?因为你的循环永远不会结束)。为什么你认为它必须变成空的?这就是你会发现错误的地方。
  • @TimPeters 我确实这样做了,但列表是空的。

标签: python list loops multidimensional-array


【解决方案1】:

循环中的第一个条件永远不会被触发。

如果块大于零(继续循环),它不会立即等于零。

【讨论】:

  • 我知道它不应该被触发。我把它扔进去,这样如果循环没有中断,它就会抓住它。
  • 不,尼克。他的意思是len(block) == 0) 永远不会评估为真。
  • 块列表的例子是什么?
  • 那么在列表为空之前,什么是循环的好选择?
【解决方案2】:
   if row == len(block):
        col = 0
        row = 0
        block.pop(0)  # If row == 1 and len(block) == 1 This will pop the last item
    if col == len(block):
        col = 0
        row += 1
    if isSpaceFree(box, row, col, block[0]):  # Then this index will be out of bounds - correct?

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多