0

0 で構成されたグリッドを印刷し、特定の番号付きサイズの形状をそれに追加する CS1 のプロジェクトに取り組んでいます。形状を追加する前に、A) グリッドに適合するかどうか、および B) 何か他のものが既に存在するかどうかを確認する必要があります。私が抱えている問題は、実行時に、形状の配置が有効であることを確認する機能が常に最初と 2 番目の形状を正しく実行することですが、その後に追加された形状は、検索時に追加された最初の形状のみを「見る」ことです。衝突のために。初めて正しいリストを取り込んでいないかどうかを確認しましたが、そうではないようです。問題の例....

シェイプ サイズ = 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最初に更新され、次にビン サイズを超えたc場合にのみ更新されるためです。rアイテムを最初に右に配置し、次に下に配置する場合は、それらを交換する必要があります。

との 2 つのforループを使用することをお勧めします。ネストされたループの両方から抜け出すには複雑なコードが必要です)。rcwhilereturn

于 2013-10-23T02:09:32.210 に答える