Премини към съдържанието
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

    Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

     

Препоръчан отговор

Може ли да помогнете с тази задаба: дадена е огърлица от черни и бели мъниста, така че няма две съседни черни мъниста. При зададени w-бели и b-черни мъниста да се отпечатат всички възможни огърлици.

Линк към коментара
Сподели в други сайтове

преди 1 минута, badsector написа:

Това цялото условие на задачата ли е? На какъв език трябва да е написана?

това е цялото условие, с++

Линк към коментара
Сподели в други сайтове

Един възможен начин е да намериш всички пермутации на мънистата, като за всяка пермутация правиш анализ и дали има съседни черни мъниста. Ако има, изхвърляш пермутацията заедно със всички последващи я пермутации, а ако няма, я отпечатваш...

Понеже това може да е бая дълъг цикъл, първо можеш да направиш анализ дали при съответните бройки черни и бели мъниста задачата въобще има решение. Ако броят на черните мъниста го обозначим Ч, а броят на белите с Б. То при Ч > Б + 1, задачата няма решение. А при Ч = 0 има едно - единствено решение...

...
...
бчбчбч -> валидна пермутация
бччбчб -> невалидна пермутация
бччббч -> пермутацията последваща невалидната пермутация, също се явява невалидна
бчччбб -> пермутацията последваща невалидната пермутация, също се явява невалидна
чбчбчб -> валидна пермутация, тази пермутация не се явява последваща на невалидната пермутация
...
...
...

И всичко това, ако в огърлицата трябва да участват всичките черни и всичките бели мъниста... Иначе, решението се усложнява...

 

Линк към коментара
Сподели в други сайтове

#include <iostream>

using namespace std;

void print(int a[], int n)
{
     static int br=0;
     cout<<++br<<". ";
     for (int i=0; i<n; ++i)
     {
         for (int j=0; j<a[i]; ++j) cout<<"W";
         if (i<n-1) cout<<"B"; else cout<<endl;
     }
}

void shiftarray(int a[], int n, int r)
{
     if (r==0) {print(a,n); return;}
     
     for (int i=0; i<n; ++i)
     {
         ++a[i];
         shiftarray(a,n,r-1);
         --a[i];
     }
}
            
int main()
{
    int b,w,*a;
    cout<<"B = "; cin>>b;
    cout<<"W = "; cin>>w;
    if (b<1 || w<1 || w<b-1) {cout<<"No solution\n"; return 0;}
    a = new int(b+1);
    a[0]=0; a[b]=0;
    for (int i=1; i<b; ++i) a[i]=1;
    shiftarray(a,b+1,w-b+1);
}

 

Линк към коментара
Сподели в други сайтове

Забелязвам  един проблем с програмата за който не съм измислил още решение.

Местейки белите топчета може да се получат повтарящи се комбинации образувани с различни бели топчета

 

Линк към коментара
Сподели в други сайтове

За съжалениие нищо умно не можах да измисля по въпроса освен да го направя по най-баламския начин - масив за всички комбинации и изключване на повторенията.

#include <iostream>

using namespace std;

int n, br=0, *a, *c;

void print()
{
     for (int i=0; i<n; ++i) c[br*n+i]=a[i];  
     cout<<++br<<". ";
     for (int i=0; i<n; ++i)
     {
         for (int j=0; j<a[i]; ++j) cout<<"O";
         if (i<n-1) cout<<"+"; else cout<<endl;
     }
}

int check()
{
    for (int i=0; i<br; ++i)
    {
        int j;
        for (j=0; j<n; ++j)
            if (c[i*n+j]!=a[j]) break;
        if (j==n) return 0;
    }   
    return 1;
}    

void shiftarray(int r)
{
     if (r==0) 
     {
          if (check()) print(); 
          return;
     }
     
     for (int i=0; i<n; ++i)
     {
         ++a[i];
         shiftarray(r-1);
         --a[i];
     }
}
            
int main()
{
    int b,w,n2=1;
    cout<<"B = "; cin>>b;
    cout<<"W = "; cin>>w;
    if (b<1 || w<1 || w<b-1) {cout<<"No solution\n"; return 0;}
    n = b+1;
    a = new int[n];
    for (int i=0; i<w-b+1; ++i) n2*=n; 
    c = new int[n2];
    a[0]=0; a[b]=0;
    for (int i=1; i<b; ++i) a[i]=1;
    shiftarray(w-b+1);
}

 

Линк към коментара
Сподели в други сайтове

6-ти ред отзад напред да се коригира на

for (int i=0; i<w-b+2; ++i) n2*=n;

че неправилно се определя размера на масива в който се записват готовите комбинации

Линк към коментара
Сподели в други сайтове

на ‎23‎.‎2‎.‎2019‎ г. в 19:36, Plamy Gerova написа:

Може ли да помогнете с тази задаба: дадена е огърлица от черни и бели мъниста, така че няма две съседни черни мъниста. При зададени w-бели и b-черни мъниста да се отпечатат всички възможни огърлици.

Ето ти едно кратко решение с STL

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
	int black, white;
	std::cout << "Enter the number of BLACK beads: ";
	std::cin >> black;
	std::cout << "Enter the number of WHITE beads: ";
	std::cin >> white;
	
	std::string necklace(black, 'B');
	necklace.append(white, 'W');

	do
	{
		if (necklace.find("BB") == std::string::npos)
			std::cout << necklace << std::endl;
	} while (next_permutation(necklace.begin(), necklace.end()));

	return 0;
}

 

Линк към коментара
Сподели в други сайтове

  • 4 седмици по-късно...

Благодаря много за задачката оценявам помощта, бях се отчаяла с нея и чак днес проверих форума 😊😅

на 28.02.2019 г. в 22:50, barry написа:

Ето ти едно кратко решение с STL

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
	int black, white;
	std::cout << "Enter the number of BLACK beads: ";
	std::cin >> black;
	std::cout << "Enter the number of WHITE beads: ";
	std::cin >> white;
	
	std::string necklace(black, 'B');
	necklace.append(white, 'W');

	do
	{
		if (necklace.find("BB") == std::string::npos)
			std::cout << necklace << std::endl;
	} while (next_permutation(necklace.begin(), necklace.end()));

	return 0;
}

 

 

на 25.02.2019 г. в 21:49, ined написа:

6-ти ред отзад напред да се коригира на

for (int i=0; i<w-b+2; ++i) n2*=n;

че неправилно се определя размера на масива в който се записват готовите комбинации

Благодаря много 

Линк към коментара
Сподели в други сайтове

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
  
int main()
{
	int black, white;
	cout << "Enter the number of BLACK beads: ";
	cin >> black;
	cout << "Enter the number of WHITE beads: ";
	cin >> white;
	
	string necklace(black, 'B');
	necklace.append(white, 'W');

	do
	{
		if (necklace.find("BB") == string::npos)
			cout << necklace << endl;
	} while (next_permutation(necklace.begin(), necklace.end()));

	return 0;
}

Така ми се вижда по добре кода

Линк към коментара
Сподели в други сайтове

Кода е супер, ама обикновенно даскалите в подобни задачи не дават да се ползва STL ами учениците сами да си напишат функциите

Линк към коментара
Сподели в други сайтове

using namespace std се счита за лош

преди 16 часа, petie1 написа:
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
  
int main()
{
	int black, white;
	cout << "Enter the number of BLACK beads: ";
	cin >> black;
	cout << "Enter the number of WHITE beads: ";
	cin >> white;
	
	string necklace(black, 'B');
	necklace.append(white, 'W');

	do
	{
		if (necklace.find("BB") == string::npos)
			cout << necklace << endl;
	} while (next_permutation(necklace.begin(), necklace.end()));

	return 0;
}

Така ми се вижда по добре кода

using namespace std се счита за лоша практика и в много случаи префикса прави кода по-лесно четим и разбираем

Линк към коментара
Сподели в други сайтове

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.

  • Разглеждащи това в момента   0 потребители

    • Няма регистрирани потребители разглеждащи тази страница.
  • Подобни теми

    • от Radon691003
      Java аплет е компилиран до име_файл.class , но не се визуализира в HTML страницата. Браузера е Mozila Firefox.
    • от georgi999
      Привет .  Имам един проект който трябва да направа , Бих искал ако може да ми дадете напътствия малко на по прост език понеже съм объркан от заданието на проекта, Ако можете да ми кажете как да започна . Нямам дисциплина на работа и се обърквам. Това е изпит по Методи на транслация. Единствено мога да работя на Visual Studio. Подходящо ли е на него да се прави такъв компилатор . Обеснете ми подробно как да започна . БИХ БИЛ МНОГО БЛАГОДАРЕН АКО МИ НАМЕРИТЕ КЛИПЧЕ ЗА ТОЗИ ПРОЕКТ И ДА ГЛЕДАМ ПО НЕГО . А това е заданието ''
      Всеки студент трябва да разработи проект по Методи на транслация. Проекта трябва да представлява транслатор (компилатор) преобразуващ програми на език от високо ниво (SimpleC или SimpleP) до език от ниско ниво (машинен език или асемблер за платформите базирани на x86, .Net IL или Java ByteCode). '' 
    • от силвия димитрова стефанова
      Здравейте! Може ли да ми помогнете с курсовата ми работа.  Това е условието. Не мога да направя точка 11‐III. Може ли да ми помогнете
      11‐I.Да се състави абстрактен клас Редактор на книга BookEditor Чисто виртуални функции:
      I.1.LIST<BOOKPAGE> GENERATEBOOK(STRING TITLE, INT NUMBERPAGES )‐ СЪЗДАВА СТРАНИЦИ ОТ КНИГА СЪС ЗАГЛАВИЕ TITLE И ПРАЗНИ СТРАНИЦИБРОЙ NUMBERPAGES И ГИ ДОБАВЯI.2.VOID SWAPPAGES(INT FIRSTPN, INT SECONDPN)‐ РАЗМЕНЯ СТРАНИЦИТЕ С НОМЕРА – ПАРАМЕТРИ FIRSTPN, SECONDPN.ПРОДУЦИРА ИЗКЛЮЧЕНИЕ, АКО НЕ МОЖЕ ДА СЕ ИЗПЪЛНИ
      11‐II.Да се състави клас Страница BookPage Скрити член променливи:
      Номер на страница‐ число int; Съдържание – низ string; Публични функции:
      II.1.КОНСТРУКТОРИ – ЕКСПЛИЦИТЕН, ПОДРАЗБИРАЩ СЕ;
      II.2.ЧЕТЕНЕ/ЗАПИС
      II.3.ЗА РАЗМЯНА НА СЪДЪРЖАНИЕ НА СТРАНИЦА С ПОДАДЕНАТА КАТО ПАРАМЕТЪР РЕФЕРЕНЦИЯ КЪМ СТРАНИЦА;
      II.4.OPERATOR == СРАВНЯВА ПО ВСИЧКИ ДАННИ
      II.5.OPERATOR< ЗА СРАВНЕНИЕ ЗА ПО‐МАЛКО НА ПОДАДЕНИЯ ПАРАМЕТЪР ОБЕКТ С ТЕКУЩИЯ ПО НОМЕР НА СТРАНИЦА
      II.6.ПРЕОБРАЗУВА / ВРЪЩА НИЗ ОТ ЧЛЕНОВЕТЕ НА КЛАСА
      II.7.OPERATOR<<(ИЗВЕЖДА В УКАЗАН ИЗХОДЕН ПОТОК)
      II.8.OPERATOR>>(ЧЕТЕ ОТ УКАЗАН ВХОДЕН ПОТОК)
      11‐III.Да се състави клас Книга Book за съхраняване на страници (подредени по номер на страница), наследник на BookEditor – клас I11‐I Скрити член променливи: Списък от страници – съдържа обекти от клас II, m_listPagesПублични функции: III.1.КОНСТРУКТОРИ – ЕКСПЛИЦИТЕН ПО БРОЙ СТРАНИЦИ И ЗАГЛАВНА СТРАНИЦА, СЪЗДАВА КНИГА СЪС ЗАГЛАВИЕ И ПРАЗНИ СТРАНИЦИ –УКАЗАНИЯ БРОЙ; ПОДРАЗБИРАЩ СЕ – СЪЗДАВА КНИГА САМО СЪС ЗАГЛАВИЕ
      III.2.ДОБАВЯНЕ НА СТРАНИЦА – ПАРАМЕТЪР СТРАНИЦА
      III.3.ПРОМЕНЯНЕ НА СТРАНИЦА – ПАРАМЕТЪР СТРАНИЦА
      III.4.ПРЕМАХВАНЕ НА СТРАНИЦА С ПОДАДЕН ПАРАМЕТЪР НОМЕР НА СТРАНИЦА
      III.5.РАЗМЕНЯНЕ НА СЪДЪРЖАНИЕ НА ПОДАДЕНИ ДВЕ РЕФЕРЕНЦИИ КЪМ СТРАНИЦИ.ПРОДУЦИРА ИЗКЛЮЧЕНИЕ, АКО НЕ МОЖЕ ДА СЕ ИЗПЪЛНИ
      III.6.ПРЕОБРАЗУВА / ВРЪЩА НИЗ ОТ ЧЛЕНОВЕТЕ НА КЛАСА
      III.7.ИМПЛЕМЕНТИРАНЕ НА ВИРТУАЛНИТЕ ФУНКЦИИ
      11‐IV.Главна функция (main) IV.1.СЪЗДАВА ОБЕКТ BOOK ОТ
      IIIIV.2.ИЗВЕЖДАНЕ НА КНИГАТА НА КОНЗОЛЕН ИЗХОД
      IV.3.ДОБАВЯНЕ НА СТРАНИЦА КЪМ
      IV.1, ИЗВЕЖДАНЕ НА РЕЗУЛТАТА НА КОНЗОЛЕН ИЗХОД
      IV.4.ПРЕМАХВАНЕ НА СТРАНИЦА ОТ
      IV.1, ИЗВЕЖДАНЕ НА РЕЗУЛТАТА НА КОНЗОЛЕН ИЗХОД
      IV.5.РАЗМЕНЯНЕ НА ДВЕ ОТ СТРАНИЦИТЕ ОТ
      IV.1, ИЗВЕЖДАНЕ НА РЕЗУЛТАТА НА КОНЗОЛЕН ИЗХОД
      IV.6.ОБРАБОТВАНЕ НА ИЗКЛЮЧЕНИЕ
    • от силвия димитрова стефанова
      Здравейте! Може ли да ми помогнете с точка II.6. Това е условието:
      Да се състави клас Страница BookPage Скрити член променливи: Номер на страница‐ число int; Съдържание – низ string; Публични функции: II.1.КОНСТРУКТОРИ – ЕКСПЛИЦИТЕН, ПОДРАЗБИРАЩ СЕ; II.2.ЧЕТЕНЕ/ЗАПИС II.3.ЗА РАЗМЯНА НА СЪДЪРЖАНИЕ НА СТРАНИЦА С ПОДАДЕНАТА КАТО ПАРАМЕТЪР РЕФЕРЕНЦИЯ КЪМ СТРАНИЦА; II.4.OPERATOR == СРАВНЯВА ПО ВСИЧКИ ДАННИ II.5.OPERATOR< ЗА СРАВНЕНИЕ ЗА ПО‐МАЛКО НА ПОДАДЕНИЯ ПАРАМЕТЪР ОБЕКТ С ТЕКУЩИЯ ПО НОМЕР НА СТРАНИЦА II.6.ПРЕОБРАЗУВА / ВРЪЩА НИЗ ОТ ЧЛЕНОВЕТЕ НА КЛАСА II.7.OPERATOR<<(ИЗВЕЖДА В УКАЗАН ИЗХОДЕН ПОТОК) II.8.OPERATOR>>(ЧЕТЕ ОТ УКАЗАН ВХОДЕН ПОТОК) Направила съм това:
      class BookPage { private: int NumberPage; //номер на страница string Contents; //съдържание public: BookPage(int numberPage, string contents) { NumberPage = numberPage; Contents = contents; } BookPage() { NumberPage = 0; Contents = " "; } const int& getNumberPage()const { return NumberPage; } const string& getContents()const { return Contents; } void setNumberPage(const int& sNumPege) { NumberPage = sNumPege; } void setContents(const string& sContents) { Contents = sContents; } bool operator == (const BookPage& book)const { return this->NumberPage == book.NumberPage, this->Contents == book.Contents; } bool operator < (const BookPage& number) { return this->NumberPage < number.NumberPage; } friend ostream& operator <<(ostream& out, const BookPage& book) { out << book.NumberPage << " " << book.Contents; return out; } friend ifstream& operator >> (ostream& in, BookPage& book) { cin >> book.NumberPage >> book.Contents; return in; } };  
    • от силвия димитрова стефанова
      Здравейте! Може ли да ми помогнете дали това е правилно направено.
      BookEditor::BookEditore() { BookPage::BookPage(); GenerateBook = 0; NumberPages = ""; } ListGenerateBook(string ownerBook, int 278 pages) { GenerateBook(adress); GenerateBook::ownerBook; BookPage::278 pages BookPage = Bookwords; BookEditor = getArea; } void swapPages(int86, int second 45) { BookPage::setAdress(obj.GenerateBook::getAdress()); BookPage::setArea(obj.GenerateBook::getArea()); BookPage::setHeight(obj.GenerateBook::getHeight()); BookPage = obj.BookPage; m_strOwner = obj.m_strOwner; }  

×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване