710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805

Расстановка N ферзей на шахматной доске N×N

30.12.2020, 12:07. Показов 20252. Ответов 28

Студворк — интернет-сервис помощи студентам
Требуется расставить N ферзей на шахматной доске N×N таким образом, чтобы никакие два ферзя не били друг друга.
Расстановку необходимо вывести в виде N строк из 2N - 1 символов, где символ '.' означает пустую клетку, символ 'Ф' - ферзя, а пробел служит разделителем.

Входные данные:

Вводится единственное натуральное число N (4 <= N <= 200).

Выходные данные:

Выведите искомую расстановку ферзей.

Пример:

Ввод: 4

Вывод:
. Ф . .
. . . Ф
Ф . . .
. . Ф .

Ограничения:

Время: 1 с
Память: 64 Мб
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.12.2020, 12:07
Ответы с готовыми решениями:

Количество расстановок N ферзей на шахматной доске N×N
Требуется подсчитать количество расстановок N ферзей на шахматной доске N×N таким образом, чтобы никакие два ферзя не били друг друга. ...

Расстановка ферзей
На шахматной доске размером n×n необходимо расставить n ферзей таким образом, чтобы ни один из них не атаковал другого. Напишите для...

Расстановка ферзей
На шахматной доске размером n×n необходимо расставить n ферзей таким образом, чтобы ни один из них не атаковал другого. Напишите для...

28
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
30.12.2020, 12:18
КулХацкеръ, What???
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.12.2020, 12:25  [ТС]
Gdez, в смысле? Что ты хотел сказать этим вопросом?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
30.12.2020, 12:30
КулХацкеръ, Это прикол?
Просто я считаю, что для твоего уровня это "семечки"
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.12.2020, 12:40  [ТС]
Ну не знаю, как по мне задачи довольно приличные по сложности.

Сейчас с удовольствием ломаю над ними голову, думаю на пару часов этих задач точно хватит мне).
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
30.12.2020, 12:52

Не по теме:

Цитата Сообщение от КулХацкеръ Посмотреть сообщение
думаю на пару часов этих задач точно хватит мне
А зачем тогда темы создаешь?


0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.12.2020, 13:02  [ТС]
Если кому-то интересно, то задачи были ранжированы по сложности так:

Расстановка N ферзей на шахматной доске N×N: *

Количество расстановок N ферзей на шахматной доске N×N: ***

Количество расстановок нескольких (K) ферзей на шахматной доске N×N: ****

Путь коня по всем клеткам шахматной доски N×M: *

Будет здорово увидеть решение задач с тремя звездами и более - это точно не "семечки"!

Добавлено через 4 минуты
А зачем тогда темы создаешь?
Затем, что задачи очень понравились! Кажется, они довольно сложные и интересные. Вот сейчас решаю как раз описанную в этой теме задачу, пока не прохожу по времени.

Добавлено через 36 секунд
Возможно туплю страшно, ведь у этой задачи всего одна звезда.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
30.12.2020, 13:05
Ну если надо любую расстановку - то всё просто. Ставим на произвольную клетку, затем на следующую не под боем, и т. д., пока останется хотя бы одна не под боем. (Т. к. ферзь бьёт симметрично во все стороны, можно утверждать, что новый ферзь не будет бить старых.)
2
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.12.2020, 13:37  [ТС]
Да я примерно так и делаю, но количество необходимых проверок растет просто жесть!

Гляньте ограничения:

Вводится единственное натуральное число N (4 <= N <= 200).
Добавлено через 4 минуты
И потом, если алгоритму не удается с первого раза расставить всех ферзей, приходится возвращаться назад и пробовать другие небитые поля, что еще больше увеличивает время выполнения программы
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
30.12.2020, 14:01
КулХацкеръ, не понял, какие проверки?
С каждым новым ферзём мы просто помечаем новые клетки под боем. Всё. Потом просто надо будет просмотреть отмеченые, чтобы найти первую попавшуюся свободную.
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.12.2020, 14:14  [ТС]
Я проверял, что каждый новый ферзь не бьет предыдущих.

То есть для второго ферзя одна проверка, для третьего две проверки, ..., для 200-го 199 проверок.

Неэффективный алгоритм, согласен. Но даже с твоим актуальна проблема:

И потом, если алгоритму не удается с первого раза расставить всех ферзей, приходится возвращаться назад и пробовать другие небитые поля, что еще больше увеличивает время выполнения программы
Слава богу, сумел-таки нагуглить алгоритм решения:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
n = int(input())
remainder = n % 6
#If the remainder is 2, swap 1 and 3
#in odd list and move 5 to the end.
if remainder == 2:
    even = list(range(1, n, 2))
    odd = list(range(2, n, 2))
    odd[1] = 0
    odd.append(4)
#If the remainder is 3, move 2
#to the end of even list and 1, 3
#to the end of odd list.
elif remainder == 3:
    even = list(range(3, n, 2))
    even.append(1)
    odd = list(range(4, n, 2))
    odd.append(0)
    odd.append(2)
#If the remainder from dividing n by 6
#is not 2 or 3 then the list is simply
#all even numbers followed by all
#odd numbers not greater than n.
else:
    even = list(range(1, n, 2))
    odd = list(range(0, n, 2))
#Append odd list to the even list
#and place queens in the rows
#given by these numbers.
result = even + odd
row = ['.'] * n
for i in range(n):
    j = result[i]
    row[j] = 'Ф'
    print(*row)
    row[j] = '.'
Код я понимаю (так как написал сам), а вот алгоритм (в комментариях) - нет, если кто даст математическое обоснование алгоритма, дам 100% отзыв.

Добавлено через 1 минуту
И с другими задачами помогите плиз, уже час прошел, а я решил только одну задачу, причем самую простую . Я надеялся за два часа решить все задачи ((.
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
30.12.2020, 14:36
КулХацкеръ, чёта всё равно не понял.
Я же выше написал - ферзь бьёт симметрично, поэтому можно не проверять, что новый ферзь не бьёт предыдущих. Вот с пешкой надо было бы провенять, а симметрично бьющую фигуру - нет.
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.12.2020, 14:45  [ТС]
Я и проверял только, что каждый новый ферзь не бьет предыдущих. То, что предыдущие ферзи бьют нового, я не проверял (точнее, проверка для нового ферзя дает ответ на этот вопрос).

Добавлено через 5 минут
И в любом случае, решение в итоге получилось другое (на основе алгоритма из Википедии).
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
30.12.2020, 15:13
КулХацкеръ, да, тогда это получается другой подход. ПММ, мой будет быстрее.
0
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
30.12.2020, 15:25
Как на счёт такого решения? Оно основано не на математике, а на наблюдении.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
n = 7
 
field = [['.'] * n for _ in range(n)]
j = 0 if n % 2 else 1
 
for i in range(n):
    field[i][j] = 'Ф'
    j = (j + 2) % n
    if n % 2 == 0 and i == (n // 2) - 1:
        j -= 1
 
for row in field:
    print(''.join(row))
3
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.12.2020, 16:08  [ТС]
unfindable_404, решение верное (за исключением того, что разделитель заменил с пустой строки на пробел).

Оно основано не на математике, а на наблюдении.
Можно подробнее?
0
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
30.12.2020, 17:38
Цитата Сообщение от КулХацкеръ Посмотреть сообщение
Можно подробнее?
Конечно.
Я всегда начинаю решать подобные задачи с перебора возможных итогов на маленьких входных данных, с целью поиска закономерностей.

Сначала разобрал вариант с n=4:
Кликните здесь для просмотра всего текста
x - поле под боем
Попробовал начать с ферзя, расположенного в углу:

Code
1
2
3
4
Q х х х
х х . .
х . х .
х . . х
Добавляю ферзя на следующей строке:
Code
1
2
3
4
Q х х х        Q х х х
х х Q x        х х x Q
х x х x        х . х x
х . x х        х x . х
Оба варианта отпали. На одном все клетки строки оказались под боем, на втором обе клетки на одной диагонали.

Пробую начать с ферзя на второй клетке

Code
1
2
3
4
x Q х х      x Q х х      x Q х х      x Q х х
х х x .  ->  х х x Q  ->  х х x Q  ->  х х x Q
. x . x      . x x x      Q x x x      Q x x x
. x . .      . x . x      x x . x      x x Q x
Всё сошлось.


Далее рассмотрел вариант с n=5
Кликните здесь для просмотра всего текста
Начал с ферзя, расположенного в углу:

Code
1
2
3
4
5
Q x x x x      Q x x x x      Q x x x x      Q x x x x      Q x x x x
x x . . .      x x Q x x      x x Q x x      x x Q x x      x x Q x x
x . x . .  ->  x x x x .  ->  x x x x Q  ->  x x x x Q  ->  x x x x Q
x . . x .      x . x x x      x . x x x      x Q x x x      x Q x x x
x . . . x      x . x . x      x . x . x      x x x . x      x x x Q x
Получилось.


На данном этапе у меня сформировалась гипотеза, что при нечетном n, нужно начинать с угловой клетки,
а при четном, со второй клетки. И ещё я заметил, что следующий ферзь нужно ставить со сдвигом вниз на одну клетку
и вправо на две клетки.

Ну и дальше я, просто, составил несколько расстановок с бОльшим значением n,
чтобы подтвердить или опровергнуть предположение.

Кликните здесь для просмотра всего текста
n = 8
Code
1
2
3
4
5
6
7
8
x Q x x x x x x
x x x Q x x x x
x x x x x Q x x
x x x x x x x Q
Q x x x x x x x
x x Q x x x x x
x x x x Q x x x
x x x x x x Q x

n = 9
Code
1
2
3
4
5
6
7
8
9
Q x x x x x x x x
x x Q x x x x x x
x x x x Q x x x x
x x x x x x Q x x
x x x x x x x x Q
x Q x x x x x x x
x x x Q x x x x x
x x x x x Q x x x
x x x x x x x Q x


Предположение подтвердилось и я написал скрипт.
1
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.12.2020, 18:16  [ТС]
unfindable_404, шикарное объяснение, спасибо большое.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
30.12.2020, 20:03
Вот мое решение... Задача-то классическая - бэктрекинг. Все руки не доходили "въехать". n ферзей на поле n*n:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
global n,fld
n=int(input("n="))
fld=[[0 for _ in range(n)] for _ in range(n)]
 
def mark_fld(r,c,z):
    global n,fld
    i=c+1
    while(i<n):
        fld[r][i]+=z
        i+=1
    i=c-1
    while(i>=0):
        fld[r][i]+=z
        i-=1
    j=r+1
    while(j<n):
        fld[j][c]+=z
        j+=1
    j=r-1
    while(j>=0):
        fld[j][c]+=z
        j-=1;
    i,j=r-1,c+1
    while(i>=0 and j<n):
        fld[i][j]+=z
        i-=1
        j+=1
    i,j=r-1,c-1
    while(i>=0 and j>=0):
        fld[i][j]+=z
        i-=1
        j-=1  
    i,j=r+1,c+1
    while(i<n and j<n):
        fld[i][j]+=z
        i+=1
        j+=1
    i,j=r+1,c-1
    while(i<n and j>=0):
        fld[i][j]+=z
        i+=1
        j-=1   
    fld[r][c]+=z    
 
def queen(c,q=[]):
    global n,fld
    if c==n:
        return
    k=0 
    while(k<n):
        if fld[k][c]==0:
            mark_fld(k,c,1)
            u=q+[(k,c)]
            if len(u)==n:
                print("!!!",u)
            queen(c+1,u)
            mark_fld(k,c,-1)
        k+=1
 
queen(0)
Вот прогон при n=5

n=5
!!! [(0, 0), (2, 1), (4, 2), (1, 3), (3, 4)]
!!! [(0, 0), (3, 1), (1, 2), (4, 3), (2, 4)]
!!! [(1, 0), (3, 1), (0, 2), (2, 3), (4, 4)]
!!! [(1, 0), (4, 1), (2, 2), (0, 3), (3, 4)]
!!! [(2, 0), (0, 1), (3, 2), (1, 3), (4, 4)]
!!! [(2, 0), (4, 1), (1, 2), (3, 3), (0, 4)]
!!! [(3, 0), (0, 1), (2, 2), (4, 3), (1, 4)]
!!! [(3, 0), (1, 1), (4, 2), (2, 3), (0, 4)]
!!! [(4, 0), (1, 1), (3, 2), (0, 3), (2, 4)]
!!! [(4, 0), (2, 1), (0, 2), (3, 3), (1, 4)]
1
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.12.2020, 21:18  [ТС]
Catstail, если вы ничего не перепутали и написали в той теме, в которой планировали, то ваше решение не соответствует постановке задачи.

А если ваше решение предназначалось для темы Количество расстановок N ферзей на шахматной доске N×N, то увы, оно проходит только 9 тестов из 12, а три теста не проходит по времени.

Но все равно спасибо. Чем больше вариантов, тем лучше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.12.2020, 21:18
Помогаю со студенческими работами здесь

Расстановка двенадцати коней на шахматной доске
Найти такую расстановку двенадцати коней на шахматной доске, при которой каждое поле находится под ударом одного из них. Один из вариантов...

Расстановка ферзей
На шахматной доске размером n×n необходимо расставить n ферзей таким образом, чтобы ни один из них не атаковал другого. Напишите для...

Расстановка ферзей на шахматной доске
Найти на кубической доске всевозможные расстановки 15 ферзей так, чтобы они не били друг друга

Расстановка восьми ферзей на шахматной доске так, чтобы ни один не угрожал другому
5. Расстановка восьми ферзей на шахматной доске так, чтобы ни один не угрожал другому.

Получить m расстановок 8 ферзей на шахматной доске, при которых ни один из ферзей не угрожает другому
10. Дано натуральное число m. Получить m расстановок 8 ферзей на шахматной доске, при которых ни один из ферзей не угрожает другому. Если m...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений в EXE. Здесь описаны базовые шаги для старта программирования с помощью CMake и MinGW. Для набора. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru