4 votos

¿Alguien puede darme algunas ideas de algoritmo para esta pregunta de tarjeta?

Problema

Hay un $N$ $1$ tarjeta larga que consta de $N$ plaza de tarjetas, cada una con el número de $1, 2, \cdots, N$, independientemente de la secuencia de cartas. Si encontramos o no el largo de la tarjeta podría estar en orden, por plegado, ya sea hacia adelante o hacia atrás. (Suponga que no hay ninguna consideración de espesor de las tarjetas).

Por ejemplo, hay una larga tarjeta es una secuencia de $\{5,3,2,1,4\}$. Entonces si se puede hacer en el orden de plegado como el siguiente: Fold

Sé que mi imagen no es visto como la plaza de tarjetas de conjunto. Sin embargo, mi pobre inglés no puede describir este problema. Espero hacer de código C o Matlab-código de la solución de este problema. Cuando una secuencia se da, quiero ver la secuencia se puede hacer como antes o no(es decir, quiero mostrar "Sí" o "No").

Lo siento y gracias por leer mi pregunta.

3voto

dave Puntos 224

Las siguientes dos preguntas son equivalentes:

  1. "Puede que las cartas plegarse a ponerlos en orden creciente, cuando están etiquetados en un determinado orden arbitrario?"

  2. "Puede que las cartas plegarse a producir un determinado orden arbitrario, cuando están etiquetados en orden creciente?"

El resultado relevante fue demostrado por Koehler en 1968 ("el Plegamiento de una Tira de Sellos"):

Una $n$-permutación $p$ es un plegamiento si y sólo si la orden circular

$p(i) < p(j) < p(i + 1) < p(j + 1)$

no se produce cuando se $i$ $j$ son ambos pares o ambos inclusive. Por orden circular se entiende cualquier permutación circular de las desigualdades anteriores.

E. g., su $5,3,2,1,4$ está decidido a ser un plegamiento de $1,2,3,4,5$ mediante la comprobación de que ninguno de sus permutaciones circulares contienen una larga de la forma $i,j,i+1,j+1$ $i$ $j$ de la misma paridad. Por otro lado, $5,3,2,4,1$ es no un plegamiento porque tiene la permutación circular $1,5,3,2,4$, que contiene la larga prohibido $1,3,2,4$ ($i=1,j=3$).

En la web, búsqueda "el plegamiento de la etiqueta sellos" para un montón de fuentes en línea.


He aquí un esbozo de un unoptimized algoritmo basado directamente en el resultado anterior:

def forbidden(n):
    # returns a list of all "forbidden" pairs; i.e., (i,j) such that  
    # 1 ≤ i ≤ n-1, 1 ≤ j ≤ n-1, i ≠ j, i ≡ j (mod 2)

def is_subseq(x,y):
    # returns True if x is a subsequence of y, else returns False

def is_folding(x):
    # returns True if sequence x is a folding, else returns False
    # cyc_perms is a list of all cyclic permutations of sequence x
    for cyc_perm in cyc_perms:
        for (i,j) in forbidden(len(x)):
            if is_subseq([i,j,i+1,j+1],cyc_perm): return False
    return True

Como un cheque en el algoritmo de corrección, he programado esta en Python y utiliza para reproducir los valores correctos de la serie de plegamientos como una función de la $N$ ( $N \le 10$ , debido a las limitaciones de tiempo).

0voto

user326210 Puntos 26

Creo que este problema puede ser similar a la de averiguar si de un laberinto es una simple alternancia de tránsito laberinto: http://www.math.stonybrook.edu/~tony/mazes/satmaze.html

En ese caso la solución sería si al escribir los números de esta manera: $n_1 n_2\cdots n_N$, se puede dibujar una línea que las visitas de los números de $1\cdots N$ a fin, pasando por encima de la hilera y a continuación el número de la línea, sin paso de peatones.

Si puedo producir razonable código para esto, voy a presentar es así.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X