J'ai donc fait ça de façon bizarre. J'ai remarqué qu'il y avait deux modèles dans la forme du tableau.
La première est la façon dont le motif des rangées supérieures a la différence entre chaque terme passant de 1 -> h où h est la hauteur et l est la longueur. Je construis donc la rangée du haut en fonction de ce modèle
Pour une matrice de dim (3,4) donnant un max RoC = 3
On verra la ligne du haut du formulaire
1, (1+1), (2+2), (4+3) = 1, 2, 4, 7
Supposons plutôt que le dim (3,9) donnant un max RoC = 3
nous verrons plutôt une rangée supérieure de
`1, (1+1), (2+2), (4+3), (7+3), (10+3), (13+3), (16+3), (19+3) = 1, 2, 4, 7, 10, 13, 16, 19, 22
Le deuxième modèle est la façon dont les lignes changent les unes des autres. Si nous considérons la matrice:
1 2 4 7 11
3 5 8 12 16
6 9 13 17 20
10 14 18 21 23
15 19 22 24 25
et soustrayez chaque ligne de la ligne ci-dessous (en ignorant la ligne supplémentaire), nous obtenons
2 3 4 5 5
3 4 5 5 4
4 5 5 4 3
5 5 4 3 2
En voyant cette matrice, nous pouvons remarquer que cette matrice est la séquence 2 3 4 5 5 4 3 2
où, par chaque ligne, 5 termes de ce modèle sont décalés de 1 pour chaque ligne. Voir ci-dessous pour le visuel.
|2 3 4 5 5| 4 3 2
2 |3 4 5 5 4| 3 2
2 3 |4 5 5 4 3| 2
2 3 4 |5 5 4 3 2|
Donc, pour obtenir la matrice finale, nous prenons notre première ligne que nous avons créée et sortie cette ligne ajoutée avec les 5 termes nécessaires de ce modèle.
Ce modèle aura toujours les caractéristiques de début 2-> max value
et de fin max value -> 2
où le max value = min(h+1, l)
et le nombre de fois que la valeur maximale apparaîtra est appearances of max = h + l -2*c -2
oùc = min(h+1, l) - 2
Donc, dans l'ensemble, ma méthode de création de nouvelles lignes ressemble
1 2 3 7 11 + |2 3 4 5 5|4 3 2 = 3 5 8 12 16
3 5 8 12 16 + 2|3 4 5 5 4|3 4 2 = 6 9 13 17 20
6 9 13 17 20 + 2 3|4 5 5 4 3|4 2 = 10 14 18 21 23
10 14 18 21 23 + 2 3 4|5 5 4 3 2| = 15 19 22 24 25
Code pertinent ci-dessous. Ça n'a pas été court mais j'aime toujours la méthode.
o,r=len,range
def m(l,h):
a,t=[1+sum(([0]+[x for x in r(1,h)]+[h]*(l-h))[:x+1]) for x in r(l)],min(l,h+1);s,c=[x for x in r(2,t)],[a[:]]
for i in r(h-1):
for j in r(o(a)):
a[j]+=(s+[t]*(l+h-2*(t-2)-2)+s[::-1])[0+i:l+i][j]
c+=[a[:]]
for l in c:print(l)
Essayez-le en ligne!