Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

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

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

 

задача за огърлица

Featured Replies

Може ли да помогнете с тази задаба: дадена е огърлица от черни и бели мъниста, така че няма две съседни черни мъниста. При зададени 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 се счита за лоша практика и в много случаи префикса прави кода по-лесно четим и разбираем

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

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

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

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.