1. represent of hanoi: choice between LinkedList, Stack, ArrayList, Array
(1) one tower can be represented by LinkedList or Stack. LinkedList has more function and it's easier to copy the tower. We need copy the tower
because we use BFS
(2) Array can not contain things like Stack<Integer>, LinkedList<Integer>, since Stack<Integer>[] = new Stack<Integer>[5] will fail. We can use ArrayList instead.
(3) use LinkedList of int[2] to represent the solution, the solution should be a field of Hanoi state and be copied. Otherwise there exists concurrency problem
2. use BFS:
(1) convert the state of tower to a String as key of HashSet so that we can easily mark the visited state. I use "," to separate the tower in Hanoi
(2) In the loop of BFS, if a certain string(state of Hanoi) is not in the HashSet, do not forget to add it into the HashSet or the loop will not stop.