Following on from my comment above, here's an example of how you might implement it using arrays, assuming you have defined the constants LEVELS and CELLS_PER_LEVEL in your main class (i.e. using "private static final"):
Cell[][] cells = new Cell[LEVELS+1][];
for(int level = 1; level <= LEVELS; level++) {
cells[level] = new Cell[CELLS_PER_LEVEL+1];
}
Of course, that leaves the cells themselves all as null. You'd need to initialize them as OddCell or EvenCell. For example, to create cell 1.5:
cells[1][5] = new OddCell();
Of course, arrays are actually numbered from zero, but because the cells are numbered from one it is simplest just to ignore these elements. cells[0] is left as null, because there is no "level 0". Likewise, cells[1][0] can be left as null, because there is no cell 1.0.
Arrays are a good choice if the number of cells never changes. On the other hand, if you have to add cells or even levels dynamically, then choose ArrayList instead. The syntax is not quite as friendly, though. For example, if you had a variable cells of type ArrayList<ArrayList<Cell>>, then to assign to cell 1.5 you would have to write:
cells.get(1).set(5, new OddCell());
Anyway, whether you use arrays, arraylists, or something else is ultimately your decision, and depends on the overall program.