<latemp_subject "The Freecell Solver Frequently Asked Questions (F.A.Q.) List" />
<h3 id="a_move_seems_wrong">I think I found a wrong move in the solution? What can I do?</h3>
While it is not unthinkable that Freecell Solver will have a bug and will
make a wrong move, it is extremely unlikely that that is the case. Some people
have reported that several multi-sequence moves are impossible, but as I
demonstrated to them, they were in fact possible.
One can find the maximal number of cards that can be moved as a sequence
in Freecell using the formula
<tt>max_cards = (1 + num_vacant_freecells) * (2 ^ num_vacant_columns)</tt>
(where “*” is multiplication and “^” is exponentiation.). One can also try using
from the <a href="https://metacpan.org/release/Games-Solitaire-Verify">Games-Solitaire-Verify CPAN distribution</a> (by the same author of Freecell Solver),
in order to filter solutions and produce ones with multi-card moves
expanded into many single-card moves. If you are on Microsoft Windows, you can
install <a href="http://dwimperl.com/">DWIM Perl</a> and run it.
<h3 id="abuse_of_fc_solve">I think I found an abuse of Freecell Solver. What should I do?</h3>
We received a report or two about various people or companies distributing
Freecell Solver along with their products, and the answer is that it is:
1. Likely legal, 2. We don't mind, and 3. We encourage commercial and/or
proprietary use of the code or binaries.
Freecell Solver used to be distributed under the Public Domain, but was
relicensed to the permissive
<a href="http://en.wikipedia.org/wiki/MIT_License">MIT/X11 licence</a> due
to the problematic and not globally accepted nature of the Public Domain,
especially in software. (See
page maintained by Rick Moen about it</a>.) As far as we know (and this is
not legal advice), the main legal and practical
difference between the public domain and the X11 licence, is that one should
keep attributing the original copyright holders as rightful holders (while
the licence of derivative works may be changed into any other). As far as
we are concerned, this is not something we want to enforce, but we still
recommend to follow this, to stay on the safe side of the law.
So unless someone sues us for damages for a problem caused by the program
or library (which violates the no warrany paragraph of the licence) everything
should be fine and the “abuse” of the program is acceptable.
<h3 id="what_are_the_uses_of_a_solver">What are the uses of a solver for Patience, such as Freecell Solver?</h3>
Freecell Solver is unlikely to help in curing cancer, or solve world hunger,
but it still has some uses. One use is determining whether an initial layout
of a game, or a layout in mid-play is solvable or not so a human player can
know whether he needs to return to an earlier position. The default
configuration of Freecell solver may still report a small number of solvable
positions as unsolved, but that can be mitigated by passing some command-line
Another use of a Solitaire solver is to find solutions for difficult deals,
or attempt to find shorter solutions. Yet another use is to collect statistics
from a large number of random deals (say, the Microsoft Windows Freecell deals
or PySolFC’s deals), which is part of what Freecell researchers do.
The Freecell implementation for Windows, Freecell 3D has also introduced a
“Race against the computer” mode of Freecell, which is an interesting challenge.
Finally, we have more recently started to investigate some “human/computer
collaborated” Freecell solving, where a human aided by a Solitaire suite with
good solver integration can attempt to solve some difficult deals (for both a
human and a computerised solver), by pruning dead ends, and by finding whether
reached states are solvable. This provides a combined solving power, that is
greater than the sum of both parts.
<h3 id="new_solver_is_too_slow">I Started Writing a Freecell Solver (of my own) but it is too slow. What can I do?</h3>
The problem with many naïve Freecell solving solutions is that, while they
can succeed in solving many Freecell deals, they may fail spectacularly in
the general case. Furthermore, Generalised Freecell (where there is an
arbitrary number of ranks) was shown to be
an <a href="http://en.wikipedia.org/wiki/NP-complete">NP-complete problem</a>
and as a result, it is unlikely that no efficient solution for solving that
can be found.
You can try inspecting the code of Freecell Solver or one of the
<a href="$(ROOT)/links.html#other_solvers">other solvers</a> for insights, but
note that their code (and especially Freecell Solver's) may be somewhat
complex, and hard to understand for people with relatively little experience.
You can also pursue some of the
<a href="$(ROOT)/docs/">Freecell Solver documentation</a> as well as the
<a href="http://tech.groups.yahoo.com/group/fc-solve-discuss/">archives of
the fc-solve-discuss mailing list</a> for some insights and ideas.
Here is some general tips:
Make sure that the positions in the graph of the game are represented as a
single segment of memory (normally a C struct) and can be compared for
equivalence easily (using memcmp() or a similar function).
Use an efficient data structure to hold the states in the collection such as
a hash table or a self-balancing binary tree.
Often randomising the solution (see Freecell Solver's Random-DFS scan
which was inspired by a different solver called Freecell Tool can help
Freecell Solver makes heavy use of switch tasking: having several different
searches operate on the same board, until the first search yields a solution.
This normally yields a solution quicker than a singular scan.
Consider implementing moves as meta-moves: sequences of several single-card
and/or sequence moves that implement a certain ends. This can yield a solution
faster than using single-card moves (also known as atomic moves).
Finally, note that we could use a helping hand with Freecell Solver, and the
authors of other open-source solvers may be happy for help as well, so if
you want to improve something more mature, then contact us.
* May I integrate Freecell Solver into my program? And how?
* The solutions are too long. What can I do?
* Why is Freecell Solver written in C? Why not in another language?
* I found a solution that Freecell Solver erroneously reports as unsolveable - should I report it to you?