回溯python_用Python回溯算法

我试图实现一个算法,该算法需要两个in和n和k,其中n是连续的座位数,k是试图坐在那一行的学生人数。问题在于每个学生在两边都必须至少有两个座位。我有一个函数可以生成所有的子集(一个0或1的数组,1表示某人坐在那里),然后我将它发送给一个函数来检查它是否是一个有效的子集。这是我对该功能的代码

def process(a,num,n):

c = a.count('1')

#If the number of students sitting down (1s) is equal to the number k, check the subset

if(c == num):

printa = True

for i in range(0,n):

if(a[i] == '1'):

if(i == 0):

if( (a[i+1] == '0') and (a[i+2] == '0') ):

break

else:

printa = False

elif(i == 1):

if( (a[i-1] == '0') and (a[i+1] == '0') and (a[i+2] == '0') ):

break

else:

printa = False

elif(i == (n-1)):

if( (a[i-2] == '0') and (a[i-1] == '0') and (a[i+1] == '0') ):

break

else:

printa = False

elif(i == n):

if( (a[i-2] == '0') and (a[i-1] == '0') ):

break

else:

printa = False

else:

if( (a[i-2] == '0') and (a[i-1] == '0') and (a[i+1] == '0') and (a[i+2] == '0') ):

break

else:

printa = False

if(printa):

print a

else:

return该代码适用于k和n的小输入,但如果我得到更高的值,出于某种原因我得不到列表错误的索引。

任何帮助,非常感谢。

O输入是一个看起来像这样的列表

['1','0','0','1','0'] # a valid subset for n=5 and k=2

['0','0','0','1','1'] # an invalid subset编辑:

调用进程的代码:

'''

This function will recursivly call itself until it gets down to the leaves then sends that

subset to process function. It appends

either a 0 or 1 then calls itself

'''

def seatrec(arr,i,n,k):

if(i==n):

process(arr,k,n)

return

else:

arr.append("0")

seatrec(arr,i+1,n,k)

arr.pop()

arr.append("1")

seatrec(arr,i+1,n,k)

arr.pop()

return

'''

This is the starter function that sets up the recursive calls

'''

def seat(n,k):

q=[]

seat(q,0,n,k)

def main():

n=7

k=3

seat(n,k)

if __name__ == "__main__":

main()如果我使用这些数字,我得到的错误是

if( (a[i-2] == '0') and (a[i-1] == '0') and (a[i+1] == '0') ):

IndexError: list index out of range

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值