Pythonnnnnn enigmas-solución de anillo de Joseph

Directorio de artículos

tarea

Escribe un problema que use una lista para resolver el anillo de José.

antecedentes

Se dice que el famoso historiador judío Josefo tiene la siguiente historia: Después de que los romanos ocuparon Chotapat, 39 judíos se escondieron en una cueva con Josefo y sus amigos.
39 Los judíos decidieron que preferían morir antes que ser capturados por el enemigo. Entonces se decidió el método del suicidio, 41 personas se alinearon en un círculo y la primera persona comenzó a reportar el conteo, cada vez que se cuenta a la tercera persona, la persona debe suicidarse. Luego, el siguiente recuento se vuelve a informar hasta que todos se suicidan. Sin embargo, Josefo y sus amigos no quisieron obedecer. Josefo les pidió a sus amigos que fingieran obedecer primero. Se colocó a sus amigos ya él mismo en las posiciones 16 y 31, por lo que escapó del juego de la muerte.
El problema de Joseph se puede describir de la siguiente manera: n personas están numeradas 1, 2, 3, ..., ny se sientan en círculo en orden. Comience a informar el número de acuerdo con 1, 2, 3, ..., my se enumeran todos los que informan a m. Hasta que todos salgan.
Inserte la descripción de la imagen aquí

Resolver

Método uno

Empiece a recorrer desde el encabezado de la lista, establezca un contador ce inicialice la configuración como 0, cada vez que se juzga, es un contador de sentencia. Si c==k(设置的序号)eso significa que el número actual debe ser eliminado, el contador regresa después de la eliminación 0. continúa, pero ccomienza a contar desde el principio. La idea específica se muestra en la siguiente figura:

x=[]
n=eval(input("输入人数"))
k=eval(input("输入序号"))
x = [i for i in range(1,n+1)]
c = 0

# 当x不为空时进行循环
while x:
    temp = x[0]
    c = c + 1
    if c == k:
        print(temp)
        c = 0
        x.remove(temp)
    else:
        x.remove(temp)
        x.append(temp)

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Método II

El primer método es pensar en ella como una lista recta, el recorrido continúa todo el tiempo, el segundo método es recorrer un círculo y el recorrido comienza desde el principio de la lista cuando llega al final.

El índice de ciclo indexcomienza desde el 0principio y termina cuando la lista tiene solo el último elemento. El
primer índice de elemento eliminado de la lista lenindica la longitud de la lista actual: el (0+(k-1))%len
segundo índice de elemento eliminado de la lista: (0+(k-1)+(k-1))%len
de hecho, es cada vez La posición del elemento eliminado en la matriz.index = (index + (k-1))%len

Dos puntos de atención :
为什么要%len?debido a que es un recorrido de bucle, debe continuar desde el principio hasta el final, como el número 1, el número 2 y el número 3, y el número se informa a su vez, el número se repite , y la persona que reportó el número 5 es el número 2.
为什么是index+(k-1)?Aunque es un número k en el futuro, debido a que un elemento que cumple con los requisitos se eliminó en la etapa anterior, los subíndices de los elementos que cumplen con los requisitos en la última etapa en realidad solo aumentan en k-1
Inserte la descripción de la imagen aquí

x=[]
n=eval(input("输入人数"))
k=eval(input("输入序号"))
x = [i for i in range(1,n+1)]
index = 0
while True:
    if len(x) == 1:
        print(x[0])
        break
    index=(index+(k-1))%len(x)
    print(lb[x])
    del lb[x]

Supongo que te gusta

Origin blog.csdn.net/weixin_39333120/article/details/110421285
Recomendado
Clasificación