Tips on finding the volume of water in a 3d chess board

前端 未结 5 1662
栀梦
栀梦 2021-02-10 07:48

So I have an assignment where I have to recreate a 3d chessboard that is a RxC grid of squares each being a different height. If the chessboard is water tight, and someone pours

5条回答
  •  心在旅途
    2021-02-10 08:34

    This is python(2.7) version of the pseudocode by @paddy .Hope this will help someone .

    import heapq
    block =[
    1, 2, 3,
    4 ,2,6,
    7, 0,5,
    11,15, 13,
    14,15,16,
    1,0,1,
    1,1,1]
    cmax =3; 
    rmax =7;
    items =[]
    fence = []
    flood = []
    waterlevel = 0
    total = 0
    class Item(object):
        visited = False
        fenced = False
        flooding = False
        height= 0
        index = 0
    i=0
    ## initializing blocks
    for val in block:    
        item =  Item();
        item.height = val
        item.index = i
        i+=1
        items.append((item.height,item))
    ## find out the edges  
    for i in range (cmax):
        heapq.heappush(fence, items[i])
        heapq.heappush(fence, items[i+(rmax-1)*cmax])
        print items[i][1].height,items[i+(rmax-1)*cmax][1].height
    
    for i in range(1,rmax-1):
        heapq.heappush(fence, items[cmax*i])
        heapq.heappush(fence, items[cmax*i+(cmax-1)])
        print items[cmax*i][1].height,items[cmax*i+(cmax-1)][1].height
    
    ## get neighbour
    def get_neighbour(i):
        c= i%cmax
        r= i//cmax
        neighbour = []
        if (c != 0):
            neighbour.append(items[r*cmax+c-1])
        if (c != (cmax -1)):
            neighbour.append(items[r*cmax+c+1])
        if (r != 0):
            neighbour.append(items[(r-1)*cmax+c])
        if (r != (rmax -1)):    
            neighbour.append(items[(r+1)*cmax+c])
        return neighbour
    
    
    
    while (len(fence)>0):
        item = heapq.heappop(fence)
        if(item[1].visited):
            continue
        if (item[1].height > waterlevel):
            waterlevel = item[1].height
        heapq.heappush(flood,item)
        item[1].flooding = True
        while(len(flood)>0):
            fitem = heapq.heappop(flood)
            depth = waterlevel - fitem[1].height
            if (depth >= 0):
                total += depth
                fitem[1].visited = True
                neighbour = get_neighbour(fitem[1].index)
                for nitem in neighbour:
                    if nitem[1].visited == False :
                        if nitem[1].flooding == False :
                            heapq.heappush(flood,nitem)
                            nitem[1].flooding = True
            else:
                fitem[1].flooding = False
                if fitem[1].fenced == False:
                    heapq.heappush(fence,fitem)
                    fitem[1].fenced = True
    print total
    

提交回复
热议问题