Ciąg kostek domina

0

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
		}
	}
}
3

a gdzie w ogóle masz jakieś return false?
debugger Twoim przyjacielem - wprowadź sobie małą liczbę danych które ogarniesz i które nie powinny spełnić warunku i z debugerem prześledź co się dzieje

0

Racja, na śmierć o return false zapomniałem. Teraz już wszystko działa. Dziękuję

1 użytkowników online, w tym zalogowanych: 0, gości: 1