From 91d2ca4003849140ea26f57fabbfe76d862e85bd Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Wed, 8 Oct 2025 14:59:03 +0000 Subject: [PATCH 1/6] A folder has been created in which the queen placement problem will be implemented. (4.Complexity-of-algorithms-and-problems). --- 4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement.py diff --git a/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement.py b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement.py new file mode 100644 index 0000000..e69de29 From 7cb1224e6f4816919fe93faf83a01cfef2688803 Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Wed, 8 Oct 2025 19:02:30 +0000 Subject: [PATCH 2/6] The first version of the program for placing queens (brute force solution) has been implemented [v.1.0.0] --- .../Task_1/Queen-placement-v.1.0.0.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.0.0.py diff --git a/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.0.0.py b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.0.0.py new file mode 100644 index 0000000..49f4859 --- /dev/null +++ b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.0.0.py @@ -0,0 +1,23 @@ +import itertools + +def n_queens_brute_force_simple(n): + if n < 0: + print("Введите неотрицательное число") + return 0 + count = 0 + for permutation in itertools.permutations(range(n)): + valid = True + for i in range(n): + for j in range(i+1, n): + if abs(i - j) == abs(permutation[i] - permutation[j]): + valid = False + break + if not valid: + break + if valid: + count += 1 + return count + +size = int(input("Введите число N: ")) +result = n_queens_brute_force_simple(size) +print(f"Количество решений: {result}") \ No newline at end of file From e46e5959936f521f55793de2e2fe5692721eb865 Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Wed, 8 Oct 2025 19:38:45 +0000 Subject: [PATCH 3/6] Added implementation of queen placement using a recursive solution (v.1.1.0) --- .../Task_1/Queen-placement-v.1.1.0.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py diff --git a/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py new file mode 100644 index 0000000..6eea470 --- /dev/null +++ b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py @@ -0,0 +1,30 @@ +def n_queens_easy(n): + if n <= 0: + print("Введите неотрицательное число") + return 0 + count = 0 + array = [0] * n + + def check(line, column): + for i in range(line): + if array[i] == column or abs(array[i] - column) == abs(i - line): + return False + return True + + def solve(line): + nonlocal count + if line == n: + count += 1 + return + + for column in range(n): + if check(line, column): + array[line] = column + solve(line + 1) + + solve(0) + return count + +size = int(input("Введите число N: ")) +result = n_queens_easy(size) +print(f"Количество решений: {result}") From 687a7c166fbca8eb186654a649fa9f73e1f1e451 Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Thu, 9 Oct 2025 18:06:36 +0000 Subject: [PATCH 4/6] The third version (v.1.2.0) of the program with the fastest solution has been added. (Multiprocessing has been added for the recursive solution.) --- .../Task_1/Queen-placement-v.1.0.0.py | 6 +- .../Task_1/Queen-placement-v.1.1.0.py | 6 +- .../Task_1/Queen-placement-v.1.2.0.py | 80 +++++++++++++++++++ .../Task_1/Queen-placement.py | 0 4 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.2.0.py delete mode 100644 4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement.py diff --git a/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.0.0.py b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.0.0.py index 49f4859..640cb87 100644 --- a/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.0.0.py +++ b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.0.0.py @@ -1,6 +1,8 @@ import itertools -def n_queens_brute_force_simple(n): +# Переборное решение + +def enumeration_solution(n): if n < 0: print("Введите неотрицательное число") return 0 @@ -19,5 +21,5 @@ def n_queens_brute_force_simple(n): return count size = int(input("Введите число N: ")) -result = n_queens_brute_force_simple(size) +result = enumeration_solution(size) print(f"Количество решений: {result}") \ No newline at end of file diff --git a/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py index 6eea470..452ec29 100644 --- a/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py +++ b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py @@ -1,4 +1,6 @@ -def n_queens_easy(n): +# Рекурсивное решение + +def recursive_solution(n): if n <= 0: print("Введите неотрицательное число") return 0 @@ -26,5 +28,5 @@ def solve(line): return count size = int(input("Введите число N: ")) -result = n_queens_easy(size) +result = recursive_solution(size) print(f"Количество решений: {result}") diff --git a/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.2.0.py b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.2.0.py new file mode 100644 index 0000000..700c0ff --- /dev/null +++ b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.2.0.py @@ -0,0 +1,80 @@ +from multiprocessing import Pool +from multiprocessing import cpu_count + +# Быстрое решение + +def recursive_solution(n): + if n <= 0: + print("Введите неотрицательное число") + return 0 + count = 0 + array = [0] * n + + def check(line, column): + for i in range(line): + if array[i] == column or abs(array[i] - column) == abs(i - line): + return False + return True + + def solve(line): + nonlocal count + if line == n: + count += 1 + return + + for column in range(n): + if check(line, column): + array[line] = column + solve(line + 1) + + solve(0) + return count + + +def wrapper(args): + n, first_col = args + + array = [first_col] + [0] * (n - 1) + count = 0 + + def check(line, column): + for i in range(line): + if array[i] == column or abs(array[i] - column) == abs(i - line): + return False + return True + + def solve(line): + nonlocal count + if line == n: + count += 1 + return + + for column in range(n): + if check(line, column): + array[line] = column + solve(line + 1) + + solve(1) + return count + +def parallel_solution(n): + if n <= 0: + print("Введите неотрицательное число") + return 0 + + tasks = [(n, col) for col in range(n)] + + with Pool(processes=cpu_count()) as pool: + results = pool.map(wrapper, tasks) + + return sum(results) + +if __name__ == "__main__": + size = int(input("Введите число N: ")) + + if size <= 8: + result = recursive_solution(size) + else: + result = parallel_solution(size) + + print(f"Количество решений: {result}") diff --git a/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement.py b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement.py deleted file mode 100644 index e69de29..0000000 From 63b7f55833e1bf01d577625ef6f71a8dc9801da0 Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Thu, 9 Oct 2025 18:59:15 +0000 Subject: [PATCH 5/6] =?UTF-8?q?Added=20complexity.md=20file=1B[C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Task_1/complexity.md | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 4.Complexity-of-algorithms-and-problems/Task_1/complexity.md diff --git a/4.Complexity-of-algorithms-and-problems/Task_1/complexity.md b/4.Complexity-of-algorithms-and-problems/Task_1/complexity.md new file mode 100644 index 0000000..dfb100e --- /dev/null +++ b/4.Complexity-of-algorithms-and-problems/Task_1/complexity.md @@ -0,0 +1,61 @@ +# Задача о расстановке ферзей + +## Описание +Три версии программы реализуют одну задачу по-разному: + +## Структура проекта +- Queen-placement-v.1.0.0 - Переборное решение +- Queen-placement-v.1.1.0 - Рекурсивное решение +- Queen-placement-v.1.2.0 - Самое быстрое решение, которое получилось. + +## Оценка сложности +### Переборное решение +Сложность: O(n! × n²) +Обоснование: +n! - генерация всех возможных перестоновок ферзей +n² - проверка каждой перестоновки на конфликт по диагонали + +### Рекрусивное решение +Сложность: O(n!) +Обоснование: 1-я строка: n вариантов, 2-я строка: (n-1) вариантов и т.д.. В худшем случае получаем n! + +### Быстрое решение +Сложность: O(n!) +Обоснование: То же, что и с рекрусивным решением, но чуть быстрее за счёт многопоточности + + +## Тест скорости + +Для тестирования используются оптимально подобранные значения N, чтобы: +- Продемонстрировать разницу в производительности +- Избежать ожидания по несколько часов для больших n + +Конфигурация системы: +- CPU: AMD Ryzen 5 5500 (6) +- GPU: 00:02.0 VMware SVGA II Adapter +- RAM: 5846MiB +- OS: Ubuntu 24.04.2 LTS x86_64 + +### Переборное решение +n = 11 +Результат: 24 секунды + +n = 12 +Результат: более 5 минут + +### рекрусивное решение +n = 12 +Результат: 4 секунды + +n = 13 +Результат: 21 секунда + +n = 14 +Результат: 2 минуты 34 секунды + +### Самое быстрое решение +n = 14 +Результат: 34 секунды + +n = 15 +Результат: 4 минуты 6 секунд \ No newline at end of file From e82c71a303ca41fbc300c8e0ed2c09d6b3710d7e Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Thu, 9 Oct 2025 19:00:48 +0000 Subject: [PATCH 6/6] minor fix in v.1.1.0 --- .../Task_1/Queen-placement-v.1.1.0.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py index 452ec29..0de6af8 100644 --- a/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py +++ b/4.Complexity-of-algorithms-and-problems/Task_1/Queen-placement-v.1.1.0.py @@ -6,24 +6,24 @@ def recursive_solution(n): return 0 count = 0 array = [0] * n - + def check(line, column): for i in range(line): if array[i] == column or abs(array[i] - column) == abs(i - line): return False return True - + def solve(line): nonlocal count if line == n: count += 1 return - + for column in range(n): if check(line, column): array[line] = column solve(line + 1) - + solve(0) return count