0

为 CS1 开发一个项目,该项目打印出一个由 0 组成的网格,并为其添加特定编号大小的形状。在添加形状之前,它需要检查 A)它是否适合网格和 B)是否已经存在其他东西。我遇到的问题是,在运行时,检查以确保形状的位置有效的功能将始终正确执行第一个和第二个形状,但之后添加的任何形状只会“看到”查看时添加的第一个形状碰撞。我检查了它是否在第一次之后没有进入正确的列表,但似乎不是这样。问题的例子......

形状尺寸 = 4、3、2、1

Python 输出:

4 4 4 4 1 2 3 0 
4 4 4 4 2 2 3 0 
4 4 4 4 3 3 3 0 
4 4 4 4 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 

应该输出:

4 4 4 4 3 3 3 1
4 4 4 4 3 3 3 0
4 4 4 4 3 3 3 0
4 4 4 4 2 2 0 0
0 0 0 0 2 2 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

这里发生了什么?完整代码如下...

def binCreate(size):
    binlist = [[0 for col in range(size)] for row in range(size)]
    return binlist

def binPrint(lst):
    for row in range(len(lst)):
        for col in range(len(lst[row])):
            print(lst[row][col], end = " ")
        print()

def itemCreate(fileName):
    lst = []
    for i in open(fileName):
        i = i.split()
        lst = i
    lst = [int(i) for i in lst]
    return lst

def main():
    size = int(input("Bin Size: "))
    fileName = str(input("Item Size File: "))
    binList = binCreate(size)
    blockList = itemCreate(fileName)
    blockList.sort(reverse = True)
    binList = checker(binList, len(binList), blockList)
    binPrint(binList)

def isSpaceFree(binList, r, c, size):
    if r + size > len(binList[0]):
        return False
    elif c + size > len(binList[0]):
        return False
    for row in range(r, r + size):
        for col in range(c, c + size):
            if binList[r][c] != 0:
              return False
            elif binList[r][c] == size:
                return False
    return True

def checker(binList, gSize, blockList):
    for i in blockList:
        r = 0
        c = 0
        comp = False
        while comp != True:
            check = isSpaceFree(binList, r, c, i)
            if check == True:
                for x in range(c, c+ i):
                    for y in range(r, r+ i):
                        binList[x][y] = i
                comp = True
            else:
                print(c)
                print(r)
                r += 1
                if r > gSize:
                    r = 0
                    c += 1
                    if c > gSize:
                        print("Imcompadible")
                        comp = True
        print(i)
        binPrint(binList)
        input()
    return binList
4

1 回答 1

1

您用于测试开放空间的代码会查看binList[r][c](其中r是行值和c列值)。但是,一旦找到开放空间,设置值的代码就会设置binList[x][y](其中x是列值,y是行值)。

后者是错误的。您想改为设置binList[y][x](按行索引,然后按列索引)。

这将为您提供一个可行的解决方案,但它仍然不会完全符合您的预期(您将在对角线上得到反射)。这是因为您的代码r首先更新,然后cr超过 bin 大小。如果你想先把物品放在右边,然后在下面,你需要交换它们。

我建议使用两个for循环 for rand c,而不是 a whiletoo,但要使其以优雅的方式工作,您可能需要分解“查找一个项目的位置”代码,以便您可以return从内部循环(而不是需要一些复杂的代码来让你跳出两个嵌套循环)。

于 2013-10-23T02:09:32.210 回答