public List<Board> neighbors() {
		int zeroRow = 0;
		int zeroColumn = 0;
		boolean condition = false;
		for (int rows = 0; rows < tiles.length; rows++) {
			if (condition) {
				break;
			}
			for (int columns = 0; columns < tiles[rows].length; columns++) {
				if (condition) {
					break;
				}
				if (tiles[rows][columns] == 0) {
					zeroRow = rows;
					zeroColumn = columns;
					condition = true;
				}
			}
		}

		// discover which sides we can go to.
		Stack<Board> stack = new Stack<Board>();
		if (zeroRow + 1 < N) {
			stack.push(swap(zeroRow, zeroColumn, zeroRow + 1, zeroColumn));
		}
		if (zeroRow - 1 >= 0) {
			stack.push(swap(zeroRow, zeroColumn, zeroRow - 1, zeroColumn));
		}
		if (zeroColumn + 1 < N) {
			stack.push(swap(zeroRow, zeroColumn, zeroRow, zeroColumn + 1));
		}
		if (zeroColumn - 1 >= 0) {
			stack.push(swap(zeroRow, zeroColumn, zeroRow, zeroColumn - 1));
		}


		return stack;
	} // all neighboring boards. Neighboring boards are defined as all boards