Wymyśliłem innego brutforsa, który ma chyba szansę działać w rozsądnym czasie:
const int N=134217728; //tyle istnieje mozliwych kwadratow
int liczbaRuchow[N];
int main()
{
for (int i=0;i<N;i++)
liczbaRuchow=-1;
for (int i=1;i<=8;i++)
{
int kod=getKodKwadratu(i); //bierzemy kod kwadratu, ktory jest wypelniony tylko cyframi i
liczbaRuchow[kod]=0;
}
int liczbaPustych=N-8;
int r=0; //liczba ruchów ktorą powinny mieć aktualnie badane kwadraty. w kazdym przebiegu petli badamy coraz bardziej "oddalone" kwadraty.
while (liczbaPustych>0)
{
for (int i=0;i<N;i++)
if (liczbaRuchow[i]==r)
{
vector<int> mozliweRuchy=getRuchy(i); //zwraca wszystkie kody kwadratow, ktore moga powstac z kwadratu i po wykonaniu jednego ruchu
for (int j=0;j<mozliweRuchy.size();j++)
if (liczbaRuchow[mozliweRuchy[j]]==-1) //jesli ten kwadrat jeszcze nie byl badany
{
liczbaRuchow[i]=r+1;
liczbaPustych--;
}
}
r++;
}
//wyniki dla wszystkich mozliwych kwadratow sa w tablicy liczbaRuchow;
}
Ogólnie pomysł opiera się na tym, że wszystkich możliwych kwadratów mamy 8^9=134217728. Każdy kwadrat możemy sobie łatwo zakodować przy pomocy liczby odwrotnie. Tworzymy sobie wielką tablicę kwadratów (indeks tablicy to kod kwadratu), której każdy element oznacza najmniejszą możliwą liczbę ruchów potrzebną do osiągnięcia w kwadracie takich samych cyfr. Tablicę wypełniamy "od tyłu". Na początku wiemy, że dla ośmiu kwadratów, które musimy osiągnąć liczba ruchów wynosi oczywiście 0. Potem w pętli wykonujemy ruchy dla już policzonych kwadratów