Проект “Учень яквчений” для реалізації в рамках курсу інформатики
2.
Як можна розв’язатиголоволомку “Судоку”? Ця на вигляд проста задача дарує своїм фанам багато годин інтелектуальнольної праці. Суть головоломки така. У деяких клитинках квадратної таблиці з 9 рядків та 9 стовпців написані цифри:
3.
Суть задачі: У деяких клітинках квадратної таблиці з 9 рядків та 9 стовпців написані цифри. Потрібно заповнити порожні клітинки цифрами так, щоб кожен рядок, кожен стовпець і кожен виділений на малюнку квадрат містили усі цифри від 1 до 9. Ідея: потрібно написати програму, яка б допомогла б розв’язувати не тільки дану головоломку .
4.
Аналізуємо: Поле длягри в судоку має розмір 9х9 клітинок і умовно розбите на 9 квадратів розміром 3х3. Кожна клітинка є або пустою, або містить число від 1 до 9. Приклад: 3 8 9 | 7 . . | 2 . . 6 7 2 | . 5 . | . 1 . . 1 4 | 6 . 9| . . 3 - - - - - - - - - - - 2 3 . | 5 . . | 8 7 1 8 5 . | . 3 7| . 4 9 4 9 7 | 8 1 .| 3 . 5 - - - - - - - - - - - . 6 5 | 4 8 2 | 1 3 . 1 . 3 | . 7 . | 4 6 . 7 4 . | 1 . 3 | 5 9 .
5.
Що потрібно??? розставитив порожні клітинки числа від 1 до 9 так, щоб: в кожному рядку числа не повторювались в кожному стовпчику числа не повторювались в кожному з 9-ти умовних квадратів числа не повторювались. 3 8 9 | 7 4 1 | 2 5 6 6 7 2 | 3 5 8 | 9 1 4 5 1 4 | 6 2 9 | 7 8 3 - - - - - - - - - - - 2 3 6 | 5 9 4 | 8 7 1 8 5 1 | 2 3 7 | 6 4 9 4 9 7 | 8 1 6 | 3 2 5 - - - - - - - - - - - 9 6 5 | 4 8 2 | 1 3 7 1 2 3 | 9 7 5 | 4 6 8 7 4 8 | 1 6 3 | 5 9 2
А ось ідея!Оберемо найпростіший спосіб - перебір можливих варіантів розстановки цифр. Якщо в процесі перебору буде знайдено розв'язок - просто виведемо його. Нехай при зчитуванні даних з файлу в клітинку на перетині рядка R і стовпця C записана цифра N. При цьому слід заблокувати інші клітинки рядка R, стовпця C і квадратика 3*3, який містить цю клітинку, так, щоб в них неможливо було записати число N.
8.
А теперскладемо алгоритм!!! перебираючи цифри по рядках, знайти нуль; якщо нуля знайти не вдалося - задача розв'язана :). Кінець. для кожної з цифр, від яких знайдена клітинка не заблокована: записати в клітинку цю цифру; заблокувати інші клітинки рядка R, стовпця C і квадратика 3*3, який містить цю клітинку, так, щоб в них неможливо було записати таку цифру; перейти до пункту 1. Як бачимо, повторний виклик алгоритму (перехід до пункту 1) виникає до повного завершення циклу в пункті 3, тобто, алгоритм є рекурсивним.