Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
Задача на C++ помогите плиз:))) |
Философия, технологии, алгоритмы! |
|
Опции темы |
07.03.2006, 19:52 | #1 |
Registered User
Сообщений: 37
Регистрация: 26.10.2005
Возраст: 36
Не в сети |
Задача на C++ помогите плиз:)))
У меня есть задача я её почти сделал т.е не то чтобы почти, но не до конца вот условие:"Текстовый файл содержит две строки (неограниченного размера) нужно вывести все слова второй строки, которые не получаются конкатенацией некоторых слов первой строки."
Вся проблема в том, что нельзя использовать классы и длина строк не ограничена Ну я делал её методом перебора, точнее хотел сделать, я разбил строки по словам и все слова слил в массив (не слова а указатели на них), соответственно для первой и второй строки. И вот теперь не знаю чё делать... Есть индексы и эти массивы слов, перебираю индексы, по полученным сочетаниям получаю новое слово, и сравниваю его с словом из второй строки..только вот блин как typedef char** string; это короче массив ссылок он динамический т.к. строки не ограниченные string* mas1=new string[w1];//массив указателей для слов первой строки string* mas2=new string[w2];//массив указателей для слов второй строки w1 и w2 это количество слов в первой и второй строке соответственно Да и на конце каждого слова '\0' далее заполнение этих массивов ; Ещё известна длина каждой строки cl1 и cl2. мне теперь нужна функция которая будет перебирать все возможные варианты или проще говоря рабочая функция которая сразу выдаст ответ Помогите плиз ) Если у кого нибудь есть такая задача поделитесь))) или помогите написать эту функцию... |
07.03.2006, 23:16 | #2 |
Форумец
Сообщений: 142
Регистрация: 17.12.2002
Возраст: 43
Не в сети |
Если правельно понял, и тебе необходимо беребрать комбинации слов - есть примерчик. Только учти, что кол-во комбинаций будет факториал от кол-ва слов. Вокак!!! Неслабое ограничение....
Собсно пример: void variant(int *rez,int kch,int *gur); int factorial(int ks); int _tmain(int argc, _TCHAR* argv[]) { // int mas[256],//ьрёёшт ё ўшёырьш фы* яхЁхсюЁр трЁшрэЄют gur[256],// ¤ї, хёышс ьюцэю с√ыю ъырёё√..... kolch,//ъюышўхёЄтю ўшёхы т ьрёёштх фы* яхЁхсюЁр i, kolvar; //чряюыэ*хь kolch = 16; for(i=0;i<kolch;i++) { mas[i] = i; gur[i] = 1; } // т√тюфшь ш яхЁхсшЁрхь, т√тюфшь ш яхЁхсшЁрхь kolvar = factorial(kolch); for(i=0;i<kolvar;i++) { printf("\n"); for(int j=0;j<kolch;j++)printf("%d ",mas[j]); variant(mas,kolch,gur); } return 0; } int factorial(int ks) { int rez = 1; for(int i = 1; i <= ks; i++) rez = rez * i; return rez; } void variant(int *rez,int kch,int *gur) { static int i,kv,l,tur=2,j,ur[30]; for(l=0;l<kch;l++)ur[l]=rez[l]; for(l=tur;l>tur/2;l--) { ur[kch-l]=rez[kch-tur+l-1]; ur[kch-tur+l-1]=rez[kch-l]; } gur[tur]++; if(gur[tur]>=tur) { for(l=2;l<kch && gur[l]>=l;l++); for(j=0;j<l;j++)gur[j]=1; tur=l; } else tur=2; for(l=0;l<kch;l++)rez[l]=ur[l]; return ; } |
08.03.2006, 08:18 | #4 |
Registered User
Сообщений: 37
Регистрация: 26.10.2005
Возраст: 36
Не в сети |
да cl1 и cl2 это количество символов в строке с пробелами
Нет ты не правильно понял как перебирать я знаю мне необходимо разобраться с указателями на слова.... Хотя тут прикинул, что лучше всего будет написать функцию которая по заданному номеру слова (количество слов в первой строке w1 во второй w2) будет давать результатом это слово и просто с этой функцией работать в переборе. Вот терь думаю как её написать |
10.03.2006, 14:55 | #7 | ||
Форумец
Сообщений: 340
Регистрация: 25.07.2002
Не в сети |
Цитата:
Цитата:
в твоем примере mas1 и mas2 это не массив указателей для слов - это массив массивов указателей на строки!!! в данном виде чушь (ИМХО ты ошибся на одну звездочку в описании типа string) Во вторых если хочешь перебором ну удачи тебе...Если слов действительно много то результата ждать запаришься. Для ускорения можешь сразу выкинуть слова из ворой строки которые не начинаются ни с одного слова, и не оканчиваются ни на одно слово из первой строки, а с оставшимися работать. Варианты либо как ты и хотел тупым перебором либо конечный автомат(имхо более быстрый вариант хотя будут трудности с динамическим построением атомата). Боле пока на ум ничего не приходит. В третьих Что значит разобраться с указателями? Есть у тебя индекс так и вперед mas1[index] - слово из вервой строки strcat(mas1[index1],mas1[index2]) объединение двух слов из первой строки int strcmp( const char *string1, const char *string2 );сравнение строк. Тебе это надо? |
||
16.03.2006, 14:52 | #9 |
Благобадаря
Сообщений: 120
Регистрация: 25.10.2005
Возраст: 36
Не в сети |
Ну тут у вас и загоны .
А чё такое конкатенация? |