Basic simulation. Just need to follow the instructions in the question.
import java.awt.Point; import java.util.ArrayList; import java.util.Scanner; /** * * @author Sanchit M. Bhatnagar * @see http://uhunt.felix-halim.net/id/74004 * */ public class P101 { public static void main(String args[]) // entry point from OS { Scanner sc = new Scanner(System.in); int size = sc.nextInt(); @SuppressWarnings("unchecked") ArrayList<Integer>[] blocks = new ArrayList[size]; for (int i = 0; i < size; i++) { blocks[i] = new ArrayList<Integer>(); blocks[i].add(i); } // System.out.println(Arrays.deepToString(blocks)); while (sc.hasNext()) { String t = sc.next(); if (t.equals("quit")) { break; } else { int a = sc.nextInt(); String x = sc.next(); int b = sc.nextInt(); if (a == b) continue; Point posA = findBlock(a, blocks); Point posB = findBlock(b, blocks); if (posA.x == posB.x) continue; if (t.equals("move")) { moveBack(posA, blocks); if (x.equals("onto")) { moveBack(posB, blocks); blocks[posA.x].remove(posA.y); blocks[posB.x].add(a); } else { blocks[posA.x].remove(posA.y); blocks[posB.x].add(a); } } else if (t.equals("pile")) { if (x.equals("onto")) { moveBack(posB, blocks); int removed = 0; int tSize = blocks[posA.x].size(); for (int i = posA.y; i < tSize; i++) { blocks[posB.x].add(blocks[posA.x].remove(i - removed)); removed++; } } else { int removed = 0; int tSize = blocks[posA.x].size(); for (int i = posA.y; i < tSize; i++) { blocks[posB.x].add(blocks[posA.x].remove(i - removed)); removed++; } } } } // System.out.println(Arrays.deepToString(blocks)); } // System.out.println(Arrays.deepToString(blocks)); for (int i = 0; i < size; i++) { System.out.print(i + ":"); int tSize = blocks[i].size(); for (int j = 0; j < tSize; j++) { System.out.print(" " + blocks[i].remove(0)); } System.out.println(); } sc.close(); } private static void moveBack(Point posA, ArrayList<Integer>[] blocks) { int removed = 0; int tSize = blocks[posA.x].size(); for (int i = posA.y + 1; i < tSize; i++) { int x = (Integer) blocks[posA.x].remove(i - removed); removed++; blocks[x].add(x); } } private static Point findBlock(int a, ArrayList<Integer>[] blocks) { for (int i = 0; i < blocks.length; i++) { for (int j = 0; j < blocks[i].size(); j++) { if ((Integer) blocks[i].get(j) == a) { return new Point(i, j); } } } return null; } }