Bonjour, j'ai trouvé ce problème en python :
https://prologin.org/train/2021/qualification/labyrinthe_demoniaque
J'essaye depuis quelques jours de le résoudre. J'ai regardé aucun tutoriel ou autre sur comment résoudre ce genre de problème et j'ai donc un peu improvisé. J'ai tenté de faire quelque chose et je ne comprends pas pourquoi ça ne fonctionne pas. Si quelqu'un de bon en python pourrait éclairer ma lanterne (:

def labyrinthe_demoniaque(a, n, m, plateau):

    def initiate_target_count(plateau,p=[]):
        for line in range(len(plateau)):
            p.append(0)
            for element in range(len(plateau[line])):
                p[line] = [[i,0] for i in plateau[line]]
        return p

    plateau = initiate_target_count(plateau)

    def get_target_list(iM,m):
        if iM != 0 and iM != m-1:
            return [iM-1,iM,iM+1]
        elif iM == 0:
            return [iM, iM+1]
        elif iM == m-1:
            return [iM-1,iM]

    iN,iM,ha,r,ended=0,0,[],[],False
    target=get_target_list(iM,m)

    while ended == False:
        a -= plateau[iN][iM][0]
        ha.append(plateau[iN][iM][0])
        if a > 0:
            print(iM)
            if iN == n-1:
                ended = True
            plateau[iN][iM][1] += 1
            iM = get_target_list(iM,m)[0]
            iN += 1
        else:
            if iM == get_target_list(iM,m)[-1]:
                a += ha[-1]
                if iM == 0:
                     if plateau[iN-1][iM+1][1] == 0:
                        iN -= 1
                     else:
                        iN -= 1
                        iM += 1
                elif iM == n-1:
                    if plateau[iN-1][iM][1] == 0:
                        iN -= 1
                        iM -= 1
                    else:
                        iN -= 1
                else:
                    if plateau[iN-1][iM+1][1] == 0:
                        if plateau[iN-1][iM][1] == 0:
                            iN -= 1
                            iM -= 1
                        else:
                            iN -= 1
                    else:
                        iN -= 1
                        iM += 1
            else:
                iM  += 1

if __name__ == '__main__':
    a,n,m = 12,4,4
    plateau = [[4, 4, 3, 4], [3, 5, 5, 4], [2, 4, 5, 3], [4, 3, 2, 5]]
    print(labyrinthe_demoniaque(a, n, m, plateau))


Si vous avez besoins que je vous explique la logique dans mon code, il n'y a aucun problème.
Merci beaucoup_
Modifié par vzytoi (25 Jan 2021 - 22:17)
Modérateur
Bonjour,

Déjà tu fais un print du résultat de la fonction labyrinthe_demoniaque(), mais celle-ci ne retourne rien.

Pour le reste, je n'ai pas cherché à comprendre.

Eventuellement, voilà comment j'aurais fait (surement perfectible) :

EDIT: j'avais oublié que ça pouvait être utilisé comme module. J'ai donc corrigé mon code initial pour tenir compte de ça.

EDIT2: simplication

EDIT3: optimisation

def walk_in_labyrinthe(ha,s,iN,iM,n,m,plateau,result):
    ha.append(iM)
    s += plateau[iN][iM]
    if s < result["a"]:
    	if iN == n-1:
    		result["a"] = s
    		result["p"] = ha
    	else:
    		if iM > 0:
    			walk_in_labyrinthe(ha.copy(),s,iN+1,iM-1,n,m,plateau,result)
    		walk_in_labyrinthe(ha.copy(),s,iN+1,iM,n,m,plateau,result)
    		if iM < m-1:
    			walk_in_labyrinthe(ha.copy(),s,iN+1,iM+1,n,m,plateau,result)

def labyrinthe_demoniaque(a,n,m,plateau):
	result = {"a":a+1,"p":[]}
	for k in range(m):
		walk_in_labyrinthe([],0,0,k,n,m,plateau,result)
	return result

if __name__ == '__main__':
    a,n,m = 12,4,4
    plateau = [[4, 4, 3, 4],[3, 5, 5, 4],[2, 4, 5, 3],[4, 3, 2, 5]]
    result = labyrinthe_demoniaque(a,n,m,plateau)
    if len(result["p"]) == 0:
    	print("IMPOSSIBLE")
    else:
    	print(result["p"])

Amicalement,
Modifié par parsimonhi (26 Jan 2021 - 13:30)
parsimonhi a écrit :
Bonjour,

Déjà tu fais un print du résultat de la fonction labyrinthe_demoniaque(), mais celle-ci ne retourne rien.

Pour le reste, je n'ai pas cherché à comprendre.

Eventuellement, voilà comment j'aurais fait (surement perfectible) :

EDIT: j'avais oublié que ça pouvait être utilisé comme module. J'ai donc corrigé mon code initial pour tenir compte de ça.

EDIT2: simplication

EDIT3: optimisation

def walk_in_labyrinthe(ha,s,iN,iM,n,m,plateau,result):
    ha.append(iM)
    s += plateau[iN][iM]
    if s &lt; result["a"]:
    	if iN == n-1:
    		result["a"] = s
    		result["p"] = ha
    	else:
    		if iM &gt; 0:
    			walk_in_labyrinthe(ha.copy(),s,iN+1,iM-1,n,m,plateau,result)
    		walk_in_labyrinthe(ha.copy(),s,iN+1,iM,n,m,plateau,result)
    		if iM &lt; m-1:
    			walk_in_labyrinthe(ha.copy(),s,iN+1,iM+1,n,m,plateau,result)

def labyrinthe_demoniaque(a,n,m,plateau):
	result = {"a":a+1,"p":[]}
	for k in range(m):
		walk_in_labyrinthe([],0,0,k,n,m,plateau,result)
	return result

if __name__ == '__main__':
    a,n,m = 12,4,4
    plateau = [[4, 4, 3, 4],[3, 5, 5, 4],[2, 4, 5, 3],[4, 3, 2, 5]]
    result = labyrinthe_demoniaque(a,n,m,plateau)
    if result["p"]:
    	print(result["p"])
    else:
    	print("IMPOSSIBLE")

Amicalement,


A première vue je ne comprends pas grand chose, merci beaucoup pour ton aide, je vais me pencher sur ton code, encore merci ! (:
Modifié par parsimonhi (26 Jan 2021 - 13:40)