Часто встречалась задача о расстановке ферзей - на шахматной доске нужно расставить 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го - всё клетки заняты(под ферзём или "под боем")
Это проблема и её будем решать в следующий раз - будем лепить к нашей программе костыли))
✅
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
spinner, littleboo, aim, ianboil, analise, francisgrey, strecoza, mishka, sergiy, vako, rbrown, gildar, ovchinnikov, andrvik, max-max, zoss, dikaniovs, dimarss, la-bella-vita, tristamoff, kilobucks, ohlamoon, shuler, maksina, yurgent71, zlody, dr-boo, arsar, volv, vasilisapor2, nefer, turkish-r, renat242, markvial, nikalaich, gromozeka, drim, status7, gryph0n, voltash, ladynazgool, ladykosha, sharps, snaryaga, cepera, rubin, francesco, exan, retoldname, stranniksenya, alikssandra, gapel, polyakov, galerina, acidgarry, kvg, oagalakova, borisss, candy777, olga-fink, virt, kis-dikiy, optimist, yurchello, dayver, bammbuss, dmitrijv, manavendra, mr-nikola, ondantr, dim447, vladsm, mirgais, now, varja, prifix, ili, abloud, dignityinside, foxycat, process, nikulinsb, tulencha, amalinavia, kito-boy, vsebudethorosho, nikitosuna, izbushka, astramar, propoker, cryptovisitor, zelivsky, html, vredinka2345, fxmonster, kash47, carpe-diem, makcl, ivanzar, marina-spring, azarovskiy, funt33, sinilga, samael27, kalter, valen-tina, maksh, mister-omortson, nightinga1e, apnigrich, siddxa, cryptobandera, doublingseason, necrogenesis, photofreediver, maryatekun, lologom, delectat, prezza, yroslav94, akva22, worthless-man, tyi-ra, elcpa, karabum, dobrotanya, boliwar, veta-less, irkinmick, wmforum, jpigeon84, svetozarhobbot, archual, automedia, alexxela, fatima, burger-knig, marko44, cryptenthusiast, charisma
Поэтому я тоже проголосовал за него!
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
@sergiy ахах, я думал это задачка для мозга, а это для алгоритмов, (а "сочинение" алгоритмов, это та еще задачка для мозга))
можно и для мозга...найди почти сотню способов, да хотя бы 10...
@sergiy, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующей категории:
Сюда приплывал Моби Дик
✅🤙 🚀