пʼятницю, 8 березня 2024 р.

Килимкова комбінаторика - 2.11-А представляє



 Нагадаю, що одночасно учні 5-Г і 11_а отримали майже однакове завдання - створити килимки із прямокутників заданих розмірів, заданих кольорів і заданої кількості. Про результати  маленького проєкту я вже писала . Нагадаю. кому цікаво- за посиланням https://halinadudar-teacher.blogspot.com/2024/02/5.html

І от сьогодні результати пошуків одинадцятикласників. Ентузіасті небагато.- Соломі я Кривицька і Роман Лещук. Вручну виявилось порахувати кількість килимків виявилось надто громіздко. Кількість килимків із заданими умовами , застосовуючи відомі 11-класникам формули комбінаторики, виходять потужно великі числа. Це спробував зробити  Роман Лещук. В кінцевому рахунку він склав програму, за якою можна утворювати килимки із заданими властивостями. Соломія, утворюючи килимки,побачила цікаві геометричні закономірності, пов'язані із розташуванням складових килимків. Отож, дивимося  на отримані килимки. І. зауважу, що тут показано лише кілька з усього різноманіття. Тому є простір для фантазії і творчості. Ну, а хто. бажає може спробувати попрацювати над математичним обгрунтуванням.Можливо. хтось скептично скаже, навіщо це потрібно. Але, повірте. застосування цьому можна знайти . Наприклад, у дизайні, у моделюванні одягу, прикрас, у побуті,... Можна створити набори для розвивальних ігор... 








 Програма Романа Лещука

include <vector>

#include <iostream>

 

using namespace std;

 

bool check(vector<vector<int>>& matrix, int xpos, int ypos, int x, int y, int type)

{

         if (xpos < 0 || xpos >= x || ypos < 0 || ypos >= y) return true;

        

         if (xpos > 0 && matrix[ypos][xpos - 1] == type) return false;

         if (xpos < x - 1 && matrix[ypos][xpos + 1] == type) return false;

         if (ypos > 0 && matrix[ypos - 1][xpos] == type) return false;

         if (ypos < y - 1 && matrix[ypos + 1][xpos] == type) return false;

         return true;

}

 

void run(vector<vector<int>>& matrix, vector<int>& count, int xpos, int ypos, int x, int y, long long& result)

{

         int newxpos = xpos, newypos = ypos;

         if (xpos == x - 1)

         {

                   newxpos = 0;

                   newypos++;

         }

         else

         {

                   newxpos++;

         }

        

         for (int i = 0; i < count.size(); i++)

         {

                   if (count[i] && check(matrix, xpos, ypos, x, y, i))

                   {

                            if (newypos == y)

                            {

                                      result++;

                                      continue;

                            }

                            matrix[ypos][xpos] = i;

                            count[i]--;

                            run(matrix, count, newxpos, newypos, x, y, result);

                            count[i]++;

                            matrix[ypos][xpos] = -1;

                   }

         }

}

 

void calcAll(vector<int> count, int xSize, int ySize)

{

         int countSum = 0;

         for (int c : count) countSum += c;

        

         vector<pair<int, int>> combs{};

         for (int i = 1; i <= sqrt(countSum); i++)

         {

                   double intpart;

                   if (modf((double)countSum / i, &intpart)) continue;

                   combs.push_back({ (int)intpart, i });

         }

        

         long long totalResult = 0;

         for (pair<int, int> comb : combs)

         {

                   cout << comb.first * xSize << 'x' << comb.second * ySize << ":\n";

                   long long currentResult = 0;

                   vector<vector<int>> matrix(comb.second, vector<int>(comb.first, -1));

                   run(matrix, count, 0, 0, comb.first, comb.second, currentResult);

                   totalResult += currentResult;

                   cout << currentResult << "\n\n";

                  

                   if (xSize != ySize)

                   {

                            totalResult += currentResult;

                            cout << comb.first * ySize << 'x' << comb.second * xSize << ":\n" << currentResult << "\n\n";

                   }

                  

                   if (comb.first != comb.second)

                   {

                            totalResult += currentResult;

                            cout << comb.second * xSize << 'x' << comb.first * ySize << ":\n" << currentResult << "\n\n";

                           

                            if (xSize != ySize)

                            {

                                      totalResult += currentResult;

                                      cout << comb.second * ySize << 'x' << comb.first * xSize << ":\n" << currentResult << "\n\n";

                            }

                   }

         }

        

         cout << "Total count: " << totalResult << '\n';

}

 

int main(int argc, char *argv[])

{

         // vector<int> count = { 5, 5, 4, 4, 3, 3 };

         vector<int> count = { 5, 4, 3, 2, 1, 1 };

         int xSize = 5;

         int ySize = 4;

        

         calcAll(count, xSize, ySize);

        

         return 0;

}



Немає коментарів:

Дописати коментар