羊、狼、农夫过河 华为OD真题 python
自己写的,可能有些小问题。
每次循环从最大数量送开始,依次从全是羊到全是狼进行遍历,将每次送的数量以(i,j)存入栈中,后续遍历至无法实现时出栈,将此时的栈进行存档,如再遇到相同的情况跳过进行循环
a,b,c=map(int,input().split())
aa=0
bb=0
d=0
cc=[]
dd=[]
e=a+b
ff=[0,0]
while e>0:
f=d
for i in range(c+1)[:0:-1]:
for j in range(i+1):
if a-j>=0 and e-i>=0 and b-i+j>=0 and((aa+j>bb+i-j and a-j>b-i+j) or (a-j==0 and aa+j>bb+i-j) or (b-j+i==0 and aa+j>bb+i-j) ):
cc.append([j,i-j])
a-=j
b-=i-j
d+=1
e-=i
aa+=j
bb+=i-j
if cc in dd:
a += ff[0]
b += ff[1]
d -= 1
e += ff[0] + ff[1]
aa -= ff[0]
bb_ = ff[1]
cc.pop()
continue
break
if f!=d:
break
if f==d:
try:
dd.append(cc)
ff=cc.pop()
except:
d=0
break
a+=ff[0]
b+=ff[1]
d-=1
e+=ff[0]+ff[1]
aa-=ff[0]
bb_=ff[1]
print(d)
自己写的,可能有些小问题。 每次循环从最大数量送开始,依次从全是羊到全是狼进行遍历,将每次送的数量以(i,j)存入栈中,后续遍历至无法实现时出栈,将此时的栈进行存档,如再遇到相同的情况跳过进行循环 a,b,c=map(int,input().split()) aa=0 bb=0 d=0 cc=[] dd=[] e=a+b ff=[0,0] while e>0: f=d for i in range(c+1)[:0:-1]: for j in range(i+1): if a-j>=0 and e-i>=0 and b-i+j>=0 and((aa+j>bb+i-j and a-j>b-i+j) or (a-j==0 and aa+j>bb+i-j) or (b-j+i==0 and aa+j>bb+i-j) ): cc.append([j,i-j]) a-=j b-=i-j d+=1 e-=i aa+=j bb+=i-j if cc in dd: a += ff[0] b += ff[1] d -= 1 e += ff[0] + ff[1] aa -= ff[0] bb_ = ff[1] cc.pop() continue break if f!=d: break if f==d: try: dd.append(cc) ff=cc.pop() except: d=0 break a+=ff[0] b+=ff[1] d-=1 e+=ff[0]+ff[1] aa-=ff[0] bb_=ff[1] print(d)