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

F
freebs
![](https://serey.io/imageupload_data/00fa07734c40c37ca5e021572342668eab862555) Часто встречалась задача о расстановке ферзей - на шахматной доске нужно расставить 8 ферзей так чтобы они не били друг друга. А решать её не доводилось, всё время она ускользала из рук, не то что бы я её считал сложной, а просто не доводилось. Хоть она и думаю сложновата для начинающих. Здесь я пытался решить её как новичок)) Решить не получилось(( придется лепить костыли чтобы она всё-таки решилась. Но учиться можно на любом примере, а порой и нужно. И всегда найдя одно решение - нужно искать решение получше, пооригинальней, покороче, побыстрее... нет предела совершенству. ![](https://i.imgur.com/7N8HknT.png) Первое что пришло в голову - ставить случайно ферзя на поле которое не под боем других ферзей. Значит нам нужна функция(упс...подпрограмма) которая после установки ферзя отмечает поля которые находятся "под боем". объявляем массив-шахматную доску `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, это границы возможного смещения относительно текущего положения ферзя. ![](https://i.imgur.com/foU1o9w.png) Отмечаем поля "под боем" на главной диагонали - условие с 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) ВСЁ!!! ![](https://i.imgur.com/ivffZU3.png) После каждой расстановки ферзя выведем наш массив на экран "." - пустая клетка "X" - клетка "под боем" "X" - красным изображён ферзь ![](https://i.imgur.com/GXnmJ4L.gif) ... и как оказалось не всё после 7го ферзя программа не может найти место для 8го - всё клетки заняты(под ферзём или "под боем") Это проблема и её будем решать в следующий раз - будем лепить к нашей программе костыли))

Comments