Yes, but you could save a bit (pun intended) by not saving the entire state but just enough so that you could calculate the entire state because you know it should be solvable
I get the feeling you don't know what we're doing. We're already kinda using
zero bytes to encode the entire state.
Explanation for those who don't know what we're talking about: Instead of storing states along with their solutions, we're storing *neither*.
We encode a state by turning it into a number from 0 to n-1, where n is the number of possible states (about 43 quintillion for 3x3 if we ignore symmetry). Now instead of *storing* that number, we just *use* it as a pointer into a large list, one list entry for each state. And such an entry is not a solution, not even just a move, but only the distance to the solved state modulo 3. So if a state can optimally be solved in 17 moves, we store "2" for it. Then to find a solution for a state, we compare its mod3dist to those of its neighbour states to determine a move that gets us closer to solved, and repeat until we're at solved.
Since each such mod3dist value is 0, 1 or 2, we can encode it in two bits. But since two bits also allow the value 3 and we're never using it, we can do better. For example we can combine five consecutive values into a number from 0 to 3[sup]5[/sup]-1=242, which is less than 2[sup]8[/sup]-1=255 so we can store the values for five states in eight bits (one byte), averaging 8/5=1.6 bits per state. Now here we're never using the numbers 243 to 255 that eight bits also allow, so we're still wasting storage opportunity. This then is where arithmetic coding comes in, which kinda really uses *fractions* of bits and we don't have any such waste anymore.