Les questions d'entrevue 08.06. Tours de problème Hanoi (Tours non récursives du problème Hanoi)

sujet:

Dans la tour classique de Hanoi, il y a trois colonnes à disques perforés et N tailles différentes, une plaque peuvent être glissés dans une colonne. Partant, toutes les plaques de haut en bas dans l' ordre croissant monté de manière séquentielle au cours de la première colonne ( à savoir, chaque plaque plus grande peut être placé au-dessus de la plaque). Lorsque le disque mobile par les restrictions suivantes:
(1) ne peut être déplacé d' un plateau;
(2) peut coulisser sur la plaque de la partie supérieure d'une colonne à la colonne suivante;
(3) plus grande que les plaques de la pile ne peut sa plaque sur.

S'il vous plaît les programmes d'écriture, avec une pile tous les plats déplacés du premier pilier pilier final.

Vous devez modifier la pile lieu.

Exemple 1:

Entrée: A = [2, 1, 0], B = [], C = []
Sortie: C = [2, 1, 0]
Exemple 2:

Entrée: A = [1, 0] , B = [], C = []
Sortie: C = [1, 0]
Conseil:

Un certain nombre de plaques ne dépasse pas 14.

 

Réponse:

Notez la version récursive de la séquence d'appel est le suivant:

f (n-1, a, c, b) // 1

f (1, a, b, c) // 2

f (n-1, b, a, c) // 3

Par conséquent, l'ordre doit être poussé sur la pile: 3-> 2-> 1 de sorte que la séquence d'exécution réelle est: 1-> 2> 3.

classe Solution {
 publique :
     struct ope {
         int num; 
        vecteur < int > * de , passe *, * à; 
        ope ( int n, vector < int > * a, vector < int > * b, vector < int > * c): num (n), à partir de (a), passe (b), (c) {}
         vide single_transfer () { 
            à -> push_back ( de -> retour ());
            de -> pop_back (); 
        } 
    }; 
    vide hanota (vector <int > & A, vector < int > & B, vector < int > & C) {
         int n = A.size (); 
        pile <ope> sta; 
        sta.push (ope (n, et A, et B, et C));
        tandis que (non sta.empty ()) { 
            auto cabot = sta.top (); 
            sta.pop (); 
            si (cur.num == 1 ) { 
                cur.single_transfer (); 
            } 
            Autre { 
                sta.push (ope (cur.num - 1 , cur.pass, cabot. De , cur.to)); // bac
                sta.push (ope ( 1 , Dev. de , cur.pass, cur.to)); // abc 
                sta.push (ope (cur.num- 1 , Dev. De , cur.to, cur.pass)); // PBR 
            }
             // Cout << endl << "A:";
            // for (int x: A) {Cout << x << " ";}
             // Cout << endl <<" B:";
            // for (int x: B) {Cout << x << " ";}
             // Cout << endl <<" C:";
            // for (int x: C) {Cout << x << » « ;

Le temps est très lent:

 

Je suppose que tu aimes

Origine www.cnblogs.com/FdWzy/p/12638193.html
conseillé
Classement