Премини към съдържанието

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


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

 

Сподели този отговор


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

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

на 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 потребители

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

  • Подобни теми

    • от FlippyBG
      Здравейте хора, кякой може ли да каже как да оправя програмата. Мерси предварително.
      Да се направи функция за копиране на дадена опашка C++ 
       
      #include <iostream>
      using namespace std;
      struct elem
      {
          int key; elem *next;
      };
      void push(elem * &first, elem * &last, elem * p, int n);
      int pop(elem * &first, elem * &last, elem * &p, int &n);
      void copyQueue(elem * first, elem * last, elem * p, elem * &first2, elem * &last2, elem * &p2, int num);
      int main()
      {
          int num;
          elem *first = NULL, *last = NULL, *p;
          elem *first2 = NULL, *last2 = NULL, *p2;

          cout << "\n ~~~ Enter a symbol to stop entering numbers ~~~\n";
          cout << "\n Enter numbers:  \n";
          while (cin >> num)
              push(first, last, p, num);
          cout << "\n The numbers are:  \n";
          //while (pop(first, last, p, num))
      //    {
      //        cout << num << " ";
      //    }

          copyQueue(first, last,p , first2, last2, p2, num);
          while (pop(first2, last2, p2, num))
          {
              cout << num << " ";
          }
          cout << "\n";
          while (pop(first, last, p, num))
          {
              cout << num << " ";
          }
      }
      void push(elem * &first, elem * &last, elem * &p, int n)
      {
          p = last;
          last = new elem;
          last->key = n;
          last->next = NULL;
          if (p != NULL) p->next = last;
          if (first == NULL)
          {
              first = last;
          }
      }
      int pop(elem * &first, elem * &last, elem * &p, int &n)
      {
          if (first)
          {
              n = first->key;
              p = first;
              first = first->next;
              if (first == NULL) last = first;
              delete p;
              return 1;
          }
          else
              system("pause");
          return 0;
      }
      void copyQueue(elem * first, elem * last, elem * p, elem * &first2, elem * &last2, elem * &p2, int num)
      {
          while (pop(first, last, p, num))
          {
              push(first2, last2, p2, num);
          }
      }
       
    • от denisov_slav
      Здравейте колеги, имам като задание да имплементирам "bash shell" ( език : С ), естествено, не в пълния си вид, а да може да изпълнява някои команди, като ( pwd, ls, echo, cat, rm, cd, etc. ). 
       
      Седнах и направих план как да напиша програмата, и мисля че съм стигнал до някъде, баш шела работи, но странно защо, въведените команди веднъж се изпълняват веднъж не ( излиза съобщение : "command not found" ). 
      Долу ще видите кода, моля за съвети как да процедирам. 
      П.С. ще прикача снимка за да имате представа за какво говоря. 
       
       
      #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> #include <time.h> #include <signal.h> #include "functions.h" #define SIZE 128 int main(int argc, char **argv) { // call shell shell_loop(); return 0; } /** * gets user input */ char *read_line(void) { char *line = NULL; size_t len = 0; // save user's input in a character array getline(&line, &len, stdin); return line; } /** * splits user input into tokens */ char **split(char *line) { int pos = 0; char **tokens = malloc(SIZE * sizeof(char *)); char *curr; curr = strtok(line, " "); while (curr != NULL) { tokens[pos] = curr; // save current word into 'tokens' pos++; // update position curr = strtok(NULL, " "); // get next word } return tokens; } /** * remove trailing '\n' */ void trim(char *s) { int len = strlen(s); // get size of string // remove newline character if (s[len - 1] == '\n') { s[len - 1] = '\0'; } } /** * gets local date and time in a specified format * and saves it into a character array */ void *getLocalDateTime(char (*myTime)[SIZE]) { time_t t; struct tm *tmp; time(&t); tmp = localtime(&t); // get local date/time // saved it in passed char array // by formatting it in a specific way strftime(*myTime, sizeof(*myTime), "[%d/%m %H:%M]", tmp); return 0; } int execute(char **args){ // if no command was entered if(args[0] == NULL){ return 1; } // if "cd" is encountered else if(strcmp(args[0], "cd") == 0 ){ return builtin_cd(args); } // else use execvp() return launch_args(args); } int launch_args(char **arguments) { pid_t pid; int status; // create a new process pid = fork(); // if child = true if (pid == 0) { // execute command if (execvp(arguments[0], arguments) == -1) { printf("shell: command not found: %s\n", arguments[0]); } exit(EXIT_FAILURE); } else if (pid < 0) { perror("forking failed"); } //TODO: else { // parent process waits for child to complete wait(&status); } return 1; } int builtin_cd(char **args) { if (args[1] == NULL) { // change directory to home directory char *home = getenv("PATH"); strcat(home, "/"); chdir(home); } else { if (chdir(args[1]) != 0) { perror("shell: directory not found"); } } return 1; } void shell_loop(void) { char *line; char **arguments; int status; char myTime[SIZE]; do { getLocalDateTime(&myTime); // get local date and time printf("%s # ", myTime); // print prompt line = read_line(); // get user input trim(line); // remove newline character arguments = split(line); // split input into tokens status = execute(arguments); // call appropriate function // cleanup free(line); free(arguments); } while (status); }  

    • от Deqn Popov
      Да се напише програма на c++ , в която е дефиниран клас правоъгълник с член-променливи: страни на правоъгълника и член-функции: конструктор с два параметъра, функция за печат, функция, която изчислява като изходен параметър правоъгълник със страни, равна на сумата от страните на два правоъгълника, зададени като входни параметри. Да се състави главна функция, която създава обект от класа и демонстрира работата на член-функциите на класа.
    • от georgi999
      здравейте приятели може ли някой да ми каже как мога да създам десктоп приложение с джава и каква програма да си изтегля на която да се пише, и каква да бъде темата на приложението ,благодаря предварително 

    • от Десислава Нешева
      Здравейте хора. Имам проблем със следната задача, моля ако някой разбира от с++ и може да ми каже къде греша и защо не ми тръгва програмата. Това е условието а по надолу е и самата програма.
      Зададена е матрица A[MxN] с реални елементи. Размерите на матрицата M и N и елементите й да се въведат от текстов файл със структура M N A11 A12 … A1N ………………. AM1 AM2 … AMN Въведената матрица да се изведе контролно на екрана. Да се състави вектор В с елементи показващи броя на елементите, по-големи от първия във всеки ред, и вектор С с елементи показващи броя на елементите, по-малки от първия във всеки стълб. Формирането на векторите да стане във функция. Извеждането им да стане на екрана. Да се намери редът/стълбът с най-голям брой елементи, изпълняващи съответното условие. Резултатът да се изведе на екрана. 
       
       
      #include <iostream>
      #include <fstream>
      #include <cmath>
      #include <iomanip>
      void matrica(float A[][10],int M,int N);
      int main()
      {
          int i,j,M,N;
          float A[10][10];
          
          do
          {
              std::cout<<"M=";
              std::cin>>M;
          }
          while(M<2||M>10);
          do
          {
              std::cout<<"N=";
              std::cin>>N;
          }
          while(N<2||N>10);

          std::ifstream fin("data.txt",std::ios::in);
          for(i=0;i<M;i++)
              for(j=0;j<N;j++)
              fin>>A[j];

          for(i=0;i<M;i++)
          {std::cout<<std::endl;
              for(j=0;j<N;j++)
              std::cout << setiosflags(std::ios::fixed) << std::setprecision(2) << A[j]<<"\t";
          }
                                  
      file.close();                            
          std::vector<int> B;                        
          std::vector<int> trackB;                
          int Bcount = 0;                            
          int Bbcount = 0;                        
          unsigned int Bbiggest = 0;                
          std::vector<int> C;                        
          std::vector<int> trackC;                
          int Ccount = 0;                            
          int Cccount = 0;                        
          unsigned int Cbiggest = 0;                
          for(int j = 0; j < M; j++){
              for (int k = 1; k < N; k++) {        
                  if (A[j][0] < A[j][k]) {
                      B.push_back(A[j][k]);
                      Bcount++;
                      Bbcount++;
                  }
              }
              trackB.push_back(Bbcount);
              Bbcount = 0;
          }

          std::cout << "\nElementi, po-golemi ot purviq element vuv vsqka redica sa: " << std::endl;        
          for (unsigned int i = 0; i < B.size(); i++) {
              std::cout << B << " ";

          }
          std::cout << "\nBroqt im e: " << Bcount << std::endl;    
          for (int j = 0; j < N; j++) {            
              for (int k = 1; k < M; k++) {
                  if (A[0][j] > A[k][j]) {
                      C.push_back(A[k][j]);
                      Ccount++;
                      Cccount++;
                  }
              }
              trackC.push_back(Cccount);
              Cccount = 0;
          }
          std::cout << "\nElementi, po-malki ot purviq element vuv vsqka kolona sa: " << std::endl;        
          for (unsigned int i = 0; i < C.size(); i++) {
              std::cout << C << " ";
          }
          std::cout << "\nBroqt im e: " << Ccount << std::endl;
          for (unsigned int i = 0; i < trackB.size(); i++) {
              if (trackB > trackB[Bbiggest]) {
                  Bbiggest = i;
              }
          }
          std::cout << "\nRedut s nai-mnogo elementi, po-golemi ot purviqt e: " << Bbiggest + 1;            
          
          for (unsigned int i = 0; i < trackC.size(); i++) {
              if (trackC > trackC[Cbiggest]) {
                  Cbiggest = i;
              }
          }
          std::cout << "\nKolonata s nai-mnogo elementi, po-malki ot purviqt e: " << Cbiggest + 1;
          std::cin.get();
      }

       
  • Дарение

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

Информация

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