python 编程题 埃及金字塔罐子倒水

解开了埃及金字塔修建秘密的考古队,现在准备进入金字塔内进行更深一步的考古工作,教授们在探险的过程中,发现了一道石门,石门上雕刻着斯芬克斯的神像,石门前放着两个罐子,罐子上标着数字,神像的头上用双手拖着一个盘子,盘子上了标着数字,神像的嘴里不停的吐着水。
教授们发现,需要打开这扇石门,需要将盘子上放上与数字重量相等的物品,另外,罐子上标着的数字代表罐子的容量。所以,考古队需要想办法用这两个罐子接到盘子上重量的水才能打开这扇石门。
现在给定你两个数字a和b,代表两个罐子的容量,再给你一个数V,代表盘子上标着的数字,你可以向罐子里倒水,将罐子里的水倒空,将一个罐子里的水倒到另一个罐子里,最终,输出你操作的步骤(fill A 代表装满罐子,empty A代表倒空A罐子,pour A B代表将A罐子里的水倒进B罐子,以此类推)

输入描述:

三个数字a, b, V 分别代表两个罐子的容量和盘子上的数字
(0

输出描述:

输出操作步骤,结尾输出success

示例1

输入 3 5 4

输出 fill B

        pour B A

        empty A

        pour B A

        fill B

        pour B A

        success

代码如下:

class State:
    def __init__(self,a,b,prev,step,operation):
        self.a=a   #A现有水量
        self.b=b   #B现`在这里插入代码片`有水量
        self.prev=prev   #父节点指针
        self.step=step   #已扩充的节点数
        self.operation=operation
#存储已访问的节点,防止重复。首先默认各个位置均为False,访问后置为T        
visited=[[False for i in range(100)]for j in range(100)]  
def bfs(capativy_a,capativy_b,left_c):
    queue=[]
    s=State(a=0,b=0,prev=None,step=0,operation=None)
    queue.append(s)
    visited[0][0]=True
    while queue:
        state=queue.pop(0)
        for i in range(6):
            a ,b ,operation =None,None,None
            if i==0:
                operation ="empty A"
                a=0
                b=state.b
            elif i==1:
                operation = "empty B"
                a=state.a
                b=0
            elif i==2:
                operation = "fill A"
                a=capativy_a
                b=state.b
            elif i==3:
                operation = "fill B"
                b=capativy_b
                a=state.a
            elif i==4:
                #将杯子A的水倒入杯子B中
                if capativy_b-state.b>state.a:
                    operation="empty A"
                    a=0
                    b=state.a+state.b
                else :
                    operation="pour A B"
                    b=capativy_b
                    a=state.a-(capativy_b-state.b)
            elif i==5:
                #将杯子B的水倒入杯子A中
                if capativy_a-state.a>state.b:
                    operation="empty B"
                    b=0
                    a=state.a+state.b
                else:
                    operation="pour B A"
                    a=capativy_a
                    b=state.b-(capativy_a-state.a)
            if  not visited[a][b]:
                new_state=State(a=a,b=b,prev=state,step=state.step+1,operation=operation)
                visited[a][b]=True
                queue.append(new_state)
                if left_c==a or left_c==b:                    
                    return new_state
    return None 

def get_path(state):
    path=[]
    while state.prev:
        path.append(state.operation)
        state  = state.prev
    return path[::-1]

def main():    
    capativy_a,capativy_b,left_c= map(int,input().split(' ') )
    result= bfs(capativy_a,capativy_b,left_c)
    if not  result:
        print("error")
    else:
        print("success")
        p=get_path(result)
        for i in range(len(p)):
            print(p[i])
main()

你可能感兴趣的:(python,python)