не содержит некоторых частностей, которые
{ int n; // результат - можно присоединить
// оставшиеся
// проверка условия завершения рекурсии
// - все слов из w[] присоединены
for (n=0; w[n]!=NULL;n++)
{ // проверка на присоединение
char *pw; // очередного слова
if (*w[n]==0) continue;
pw=w[n]; // пустое слово - пропустить
w[n]=""; // исключить проверяемое слово из
// множества
{ // попытка присоединить слово
if (step(pw)) // - рекурсивный вызов
{ ...
return 1; // удача - завершить успешно
}
}
w[n]=pw; // возвратить исключенное слово
} // неудача - нельзя присоединить
return 0; // ни одного слова
}
Данный " набросок" не содержит некоторых частностей, которые не меняют общей картины :
проверка условия завершения рекурсии - если массив указателей содержит только пустые строки, то рекурсивная последовательность шагов завершена успешно (все слова выбраны на предыдущих шагах) ;
проверка совпадения " хвоста" очередного слова и начала выбираемого на текущем шаге - делается отдельной функцией ;
сама цепочка выбранных слов выводится в процессе " ретрансляции" положительного результата непосредственно на экран в обратном порядке (что не совсем " красиво" ). В принципе она может быть сформирована и в глобальных данных.
//------------------------------------------------------bk54-03.cpp
#include <iostream.h>
#include <string.h>
char *w[]={"РАСИСТ","МАТРАС","МАСТЕР","СИСТЕМА","СТЕРВА",
NULL};
int step(char *lw) // параметр - текущее слово цепочки
{ int n;
for (n=0; w[n]!=NULL;n++)
if (*w[n]!=0) break;
if (w[n]==NULL) // цепочка выстроена, все слова
return 1; // из w[] присоединены
for (n=0; w[n]!=NULL;n++)
{ // проверка на присоединение
char *pw; // очередного слова
if (*w[n]==0) continue;
pw=w[n]; // пустое слово - пропустить
w[n]=""; // исключить проверяемое слово из
if (TEST(lw,pw)) // множества
{ // попытка присоединить слово
if (step(pw)) // присоединено - попытка вывести
Содержание Назад Вперед