Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
sergiy
6 лет назад

26 FreeBASIC - Расстановка ферзей

Часто встречалась задача о расстановке ферзей - на шахматной доске нужно расставить 8 ферзей так чтобы они не били друг друга. А решать её не доводилось, всё время она ускользала из рук, не то что бы я её считал сложной, а просто не доводилось. Хоть она и думаю сложновата для начинающих. Здесь я пытался решить её как новичок)) Решить не получилось(( придется лепить костыли чтобы она всё-таки решилась.

Но учиться можно на любом примере, а порой и нужно. И всегда найдя одно решение - нужно искать решение получше, пооригинальней, покороче, побыстрее... нет предела совершенству.

Первое что пришло в голову - ставить случайно ферзя на поле которое не под боем других ферзей.

Значит нам нужна функция(упс...подпрограмма) которая после установки ферзя отмечает поля которые находятся "под боем".

объявляем массив-шахматную доску
dim shared a(1 to 8,1 to 8) as integer
0-пустая клетка
1-поле "под боем"
2-сам ферзь

теперь пишем подпрограмму set(x,y) в которую передаются координаты клетки куда устанавливается очередной ферзь.

sub set(byval x as integer, byval y as integer)
    dim i as integer
    for i=-7 to 7
        
        if x+i>0 and x+i<9 and y+i>0 and y+i<9 then if a(x+i,y+i)=0 then a(x+i,y+i)=1
        if x+i>0 and x+i<9 and y-i>0 and y-i<9 then if a(x+i,y-i)=0 then a(x+i,y-i)=1
        
        if x+i>0 and x+i<9 then a(x+i,y)=1
        if y+i>0 and y+i<9 then a(x,y+i)=1
    next i
    a(x,y)=2
end sub

Открываем цикл от -7 до 7, это границы возможного смещения относительно текущего положения ферзя.

Отмечаем поля "под боем" на главной диагонали - условие с a(x+i,y+i) и на побочной - условие с a(x+i,y-i)

и также отмечаем вертикальную и горизонтальную линии "под боем"

Это заполнение можно было организовать по другому - вне этого цикла и без условий.
после цикла делаем ещё один:

for i=1 to 8
    a(i,y)=1:a(x,i)=1
next i

Заполнение главной и побочной диагоналей боя ферзя можно так же сделать без проверки условий - весь фокус в вычислении границ "от" и "до" в зависимости от x и y.

А что лучше - четыре цикла без условий? или один но с кучей условий... здесь уж на вкус и цвет...

Теперь перейдём к основной программе

Ферзей 8 - открываем цикл от 1 до 8
Далее цикл по условию-выбираем случайную клетку и если она пустая запускаем к ней set(x,y)

ВСЁ!!!

После каждой расстановки ферзя выведем наш массив на экран
"." - пустая клетка
"X" - клетка "под боем"
"X" - красным изображён ферзь

... и как оказалось не всё
после 7го ферзя программа не может найти место для 8го - всё клетки заняты(под ферзём или "под боем")

Это проблема и её будем решать в следующий раз - будем лепить к нашей программе костыли))

15
377.220 GOLOS
На Golos с October 2016
Комментарии (7)
Сортировать по:
Сначала старые