Моя дружина знайшла собі заняття на той час поки чекає на мене з роботи. Вона розгадує японські кросворди (хто не в курсі, це такі де треба замальовувати клітинки і врезультаті отримуємо малюнок). Вона вже доволі добре нацикалася його розв"язувати, але деякі поставили її в глухий кут.
Тут я згадав студентські роки, коли було нємєряно часу і ми займалися тим що нам подобалося (крім останніх 2-х тижнів перед сесією :) ). Мені закортіло згадати алгоритми і структури даних. Я почав писати програму яка розв"язує японські кросворди :) Пишучи алгоритми розв"язку я зрозумів що я розв"язую ті кросворди набагато гірше за мою кохану. Тому програма не зможе рішити ті кросворди які вона не змогла рішити :(
Прийшлось поміняти тактику. Я рішив примінити грубу силу (повний перебір). Тобто спочатку я використовува ті алгоритми які написав, а після того доповнював все з допомогою перебору всіх варіантів. Це був тернистий шлях згадування що таке рекурсія і як її написати :) Коли я перший раз запустив ту програму, то зрозумів що рахувати вона буде довго і тому треба виводити якісь проміжні результати. Так і зробив. Після нескладних математичних підрахунків вийшло що моя програма буде рахувати результат 2.5Е+110 секунд :) Вобщем ви зрозуміли що Сонце згасне швидше ніж я дочекаюся результату :) Після нескладної оптимізації програма почала працювати в 100 разів швидше :)
Вобщем оптимізація не помогла :)
Тут було тільки 2 варіанти виходу з ситуації:
1. Написати програму розприділених обчислень і роздавати ці обчислення всім бажаючим які поставлять в себе ці програми (так роблять для програм які обчисляють структуру лікарства проти раку і т.д.)
2. Поміняти алгоритм обчислення.
Я прикинув, що при 1-му варіанті, навіть якщо 1 млрд людей поставить собі мою програмку, то ми всеі рівно будемо чекати на результат 2.5Е+99 секунд. Тому цей варіант був відкинутий як не ефективний :)
Це вже було питання плану зможу/не зможу.
І ось, після 4-х годин планування алгоритму і його реалізації та після 2-х годин пошуку багів, вона (програма) народилася. Вона розгадує великі кросворди розміром 28*40 за лічені секунди!
Ура товариші! Успіхів вам на творчій ниві :)
6 коментарів:
Молодець. Я теж таку програму написав, коли ще був маленький ;-)
Юра, запатентуй винахід і зароби гроші. Ти тільки подумай, журнали із кросвордами для дуже лінивих будуть продавати з диском. А на диску твоя гордість ....
Сорци в студію :)
P.S. поздоровляю з одруженням :)
Маси народні просять коду!
Почекайте, я ще його не запантетував :)
За пару днів приведу код в порядок і обов"язково викладу його тут :)
ше треба буде написати кусок програми яка буде складати кросворд. і тоді частина буде складати, частина розвязувати, і комп буде загружений, і програмісти не без заняття :))
Дописати коментар