羊、狼、农夫过河 华为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)
经验分享 程序员 微信小程序 职场和发展