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го - всё клетки заняты(под ферзём или "под боем")
Это проблема и её будем решать в следующий раз - будем лепить к нашей программе костыли))