705 / 351 / 104
Регистрация: 09.02.2018
Сообщений: 798
|
||||||
1 | ||||||
Количество расстановок N ферзей на шахматной доске N×N30.12.2020, 15:05. Показов 12420. Ответов 17
Требуется подсчитать количество расстановок N ферзей на шахматной доске N×N таким образом, чтобы никакие два ферзя не били друг друга.
Расстановка ферзей таким образом называется мирной. Например, для доски 8×8 существует 92 различные мирные расстановки ферзей. Входные данные: Вводится единственное натуральное число N (1 <= N <= 12). Выходные данные: Выведите искомое количество мирных расстановок ферзей. Пример: Ввод: 8 Вывод: 92 Ограничения: Время: 1 с Память: 64 Мб Добавлено через 2 часа 53 минуты Вот что набросал:
Посоветуйте что-нибудь. Добавлено через 2 минуты
0
|
30.12.2020, 15:05 | |
Ответы с готовыми решениями:
17
Расстановка N ферзей на шахматной доске N×N Количество расстановок нескольких (K) ферзей на шахматной доске N×N Получить m расстановок 8 ферзей на шахматной доске, при которых ни один из ферзей не угрожает другому Получить m расстановок 8 ферзей на шахматной доске |
8214 / 4334 / 1837
Регистрация: 27.03.2020
Сообщений: 7,157
|
|
30.12.2020, 16:12 | 2 |
КулХацкеръ, ссылка на тестер есть?
0
|
705 / 351 / 104
Регистрация: 09.02.2018
Сообщений: 798
|
|
30.12.2020, 17:23 [ТС] | 3 |
0
|
8214 / 4334 / 1837
Регистрация: 27.03.2020
Сообщений: 7,157
|
||||||
30.12.2020, 18:49 | 4 | |||||
КулХацкеръ, Не получается 10 . Нужна рекурсия. Я в ней как то никак
1
|
705 / 351 / 104
Регистрация: 09.02.2018
Сообщений: 798
|
|
30.12.2020, 19:43 [ТС] | 5 |
Gdez, аналогично. Сумел улучшить свой результат до 10 тестов из 12, но не более того.
Спасибо большое за вариант, он гораздо красивее моего. Добавлено через 29 минут
0
|
3572 / 2173 / 570
Регистрация: 02.09.2015
Сообщений: 5,490
|
|
30.12.2020, 20:04 | 6 |
Остальные 2 TL (timelimit)? Сделай прекеш (посчитай вручную или с помощью программы результат для 1 <= n <= 12) и возвращай результат.
P. S. Стата говорит, что решений на Python'е нет. P. P. S. А остальные решения за 0 ms явно указывают на то, что так и нужно было. Быстрее чем O(1) не написать решение.
0
|
705 / 351 / 104
Регистрация: 09.02.2018
Сообщений: 798
|
|
30.12.2020, 20:38 [ТС] | 7 |
Arsegg, да, остальные два теста - лимит времени.
0
|
8214 / 4334 / 1837
Регистрация: 27.03.2020
Сообщений: 7,157
|
|
30.12.2020, 20:43 | 8 |
КулХацкеръ, может с рекурсией у тебя получше, чем у меня?
Просто как то летом решал на информатиксе => там до 10.
0
|
705 / 351 / 104
Регистрация: 09.02.2018
Сообщений: 798
|
||||||||||||||||
31.12.2020, 00:09 [ТС] | 9 | |||||||||||||||
Gdez, если смотреть по времени - то да, мое решение с рекурсией получше. На 11 тесте время примерно четверть секунды (у тебя примерно три четверти секунды).
Код такой:
Да, Arsegg, посмотрел другие решения, и судя по времени, некоторые не гнушались грязных хаков. Чего-нибудь вроде этого, я так думаю:
Добавлено через 1 час 14 минут Ссылка на еще один вариант решения данной задачи, автор Catstail. Добавлено через 1 час 55 минут Переписал свой код на C, довольно корявенько (ведь я не умею программировать на этом языке). Программа прошла все тесты за 654 мс, я в полном шоке!! Не думал, что C настолько быстрее Python, особенно в столь неумелых руках, как мои. Решение на C:
0
|
Arsegg
|
31.12.2020, 00:17
#10
|
0
|
494 / 340 / 134
Регистрация: 14.06.2016
Сообщений: 660
|
|
31.12.2020, 00:46 | 11 |
Доска симметричная.
0
|
8214 / 4334 / 1837
Регистрация: 27.03.2020
Сообщений: 7,157
|
||||||
31.12.2020, 07:58 | 12 | |||||
Сообщение было отмечено КулХацкеръ как решение
Решение
КулХацкеръ, http://www.ic-net.or.jp/home/takaken/e/queen/
Но не мои
0
|
8214 / 4334 / 1837
Регистрация: 27.03.2020
Сообщений: 7,157
|
|
31.12.2020, 09:30 | 14 |
Catstail, А скорость за счет битовых операций?
По сравнению с Вашим кодом
0
|
Модератор
|
|
31.12.2020, 09:39 | 15 |
Gdez, конечно, битовые операции быстрее! Мой код слишком "разлапист", но более нагляден. Есть подозрение, что мой код можно ускорить за счет того, что исключить многократный вызов mark_fld (т.е. втянуть эту функцию внутрь queen). Это ускорит код, но противоречит правильным принципам программирования...
0
|
8214 / 4334 / 1837
Регистрация: 27.03.2020
Сообщений: 7,157
|
|
31.12.2020, 09:51 | 16 |
Catstail, В том коде симметричность, да и идет поиск числа "правильных" позиций без запоминания расположения плюс они "растянули" доску в одномерную последовательность.
А так, Ваш код, конечно, понятнее. Но все равно пока мне очень далеко до этого уровня
1
|
Catstail
|
31.12.2020, 12:17
#17
|
Не по теме: Gdez, нам всем есть куда расти! Успехов в новом году!
0
|
0 / 0 / 0
Регистрация: 05.03.2022
Сообщений: 2
|
|
21.12.2023, 08:06 | 18 |
#include <iostream>
using namespace std; int kol = 0; const int n = 8; bool a[n][n]; void ans(int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << a[i][j] << '\t'; } cout << endl; } } bool logic(int str, int st) { for (int i = 0; i < str; i++) { // проверка столбца /*if (a[i][str] == 1) return 0;*/ if (a[st][i] == 1) return 0; } int strx = str, sty = st; while (str > 0 && st > 0) {// проверка главной диагонали if (a[st - 1][str - 1] == 1) return 0; str--; st--; } while (strx > 0 && sty < n - 1) { //проверка побочной диагонали if (a[sty + 1][strx - 1] == 1) return 0; strx--; sty++; } return 1; } void board(int str) { if (str == n) { kol++; ans(n); cout << endl; return; } for (int i = 0; i < n; i++) { if (logic(str, i)) { a[i][str] = 1; board(str + 1); a[i][str] = 0; } } } int main() { board(0); cout << kol; }
0
|
21.12.2023, 08:06 | |
21.12.2023, 08:06 | |
Помогаю со студенческими работами здесь
18
Рекурсия: найти количество всевозможных различных расстановок n ферзей на доске n*n Определить количество расстановок ладей на шахматной доске Разместить на шахматной доске 8х8 максимальное количество ферзей Вывести максимальное количество ферзей, которых можно расставить на шахматной доске 8 ферзей на шахматной доске Расстановка ферзей на шахматной доске Расположить на шахматной доске 8 ферзей Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |