Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/103: Рейтинг темы: голосов - 103, средняя оценка - 4.62
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805

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

30.12.2020, 12:07. Показов 20157. Ответов 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
8849 / 4501 / 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
8849 / 4501 / 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
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru