Witam. Mógłby mnie ktoś, proszę, oświecić, dlaczego funkcja sprawdzająca, czy dla danego zestawu kostek domina da się je ułożyć w ciąg, zwraca ciągle true?
#include <iostream>
using namespace std;
/***kostka domina o 2. polach***/
struct domino
{
int p1;
int p2;
};
bool check_dom(int i, int last, domino tab[], int N);
int main()
{
int N;
domino *t;
cout << "Enter the number of domino pieces: ";
cin >> N;
t = new domino[N];
cout << "Enter values for each piece one by one (0-6)\n";
for (int i = 0; i < N; i++)
cin >> t[i].p1 >> t[i].p2;
if (check_dom(0, -1, t, N))
cout << "true" << endl;
else cout << "false" << endl;
return 0;
}
/*-----------------------SPRAWDZANIE KOSTEK---------------------------*/
//i - numer wcielenia rekurencji; last - wartość ostatniego pola w ciągu
bool check_dom(int i, int last, domino tab[], int N)
{
static bool *used = new bool[N]; //Tablica used pokazuje czy dana
if (last == -1) //z N kostek została już użyta.
for (int j = 0; j < N; j++) used[j] = false; //Wyzerowanie used w pierwszym
//wywołaniu rekurencji.
if (i == N) return true;
for (int k = 0; k < N; k++)
{
if (!used[k])
{
used[k] = true;
if (last == -1)
return check_dom(i + 1, tab[k].p1, tab, N) //ułożenie 1-szej kostki
|| check_dom(i + 1, tab[k].p2, tab, N); //na 2 sposoby
if (last == tab[k].p1)
if (check_dom(i + 1, tab[k].p2, tab, N))
return true;
if (last == tab[k].p2)
if (check_dom(i + 1, tab[k].p1, tab, N))
return true;
used[k] = false; //przywrócenie do użytku i-tej kostki
}
}
}