public class Appli {
	/**
	 * Déplace le disque étant au sommet d'une tour vers une autre.
	 * 
	 * @param de
	 *            La tour d'où est retiré le disque étant au sommet.
	 * @param vers
	 *            La tour sur laquelle le disque est déposé.
	 */
	private static void bouger(Tour de, Tour vers) {
		assert (!de.estVide() && (vers.estVide() || de.sommet() < vers.sommet()));
		assert (!de.estVide() && (vers.estVide() || de.sommet() < vers.sommet()));
		int d = de.sommet();
		de.retirer();
		vers.ajouter(d);
	}

	/**
	 * Déplace plusieurs disques étant au sommet d'une tour vers une autre en
	 * employant une troisième tour intermédiaire.
	 * 
	 * @param de
	 *            La tour de départ.
	 * @param nb
	 *            Le nombre de disques devant être déplacés de son sommet.
	 * @param vers
	 *            La tour destination.
	 * @param via
	 *            La tour servant d'intermédiaire dans les dépacements.
	 * @return Le nombre de déplacements de disques effectués.
	 */
	private static int déplacer(Tour de, int nb, Tour vers, Tour via) {
		assert (de.nbDisques() >= nb);
		if (nb == 0)
			return 0;
		int nbdep1 = déplacer(de, nb - 1, via, vers);
		bouger(de, vers);
		int nbdep2 = déplacer(via, nb - 1, vers, de);
		return nbdep1 + 1 + nbdep2;
	}

	/** Programme illustrant le problème des tours de Hanoï. */
	public static void main(String[] args) {
		final int TAILLE = 3, N = 20;
		Tour[] tours = new Tour[TAILLE];
		
		tours[0] = new Tour(N);
		for (int i = 1; i < TAILLE; ++i)
			tours[i] = new Tour();

		for (Tour t : tours)
			System.out.println(t.toString());

		int nbdep = déplacer(tours[0], N, tours[2], tours[1]);
		System.out.println("nombre de déplacements : " + nbdep);

		for (Tour t : tours)
			System.out.println(t.toString());
	}
}
