imho.ws |
![]() |
![]() |
![]() |
# 1 |
Member
Регистрация: 30.05.2003
Адрес: Литва
Пол: Male
Сообщения: 329
![]() ![]() ![]() ![]() ![]() ![]() |
Снова задачка по языку Pascal
Доброе время суток Гуру Pascalя.
Очень бы хотелось найти вот такую задачку: Надо написать функцию, которая на шахматной доске расставит 12 коней так, чтобы они покрывали все другие клетки. Как расставить фигуры, я знаю: b6 c2 c3 c5 c6 d3 e6 f3 f4 f6 f7 g3 Проблема - это запрограмить как можно легче... без графики и других наворотов. Большое спасибо! |
![]() |
![]() |
# 2 |
Junior Member
Регистрация: 29.09.2005
Сообщения: 99
![]() |
Без графики, это только если представить шахматную доску в виде двумерной матрицы размером 8х8. Только не пойму почему функцию, а не процедуру, функция после своего выполнения должна возвращать какое то значение: например функция сложения двух чисел A+B возвращает значение С-сумма. Если писать процедуру, то приблизительно код тела процедуры выглядит так:
for i:=1 to 8 do begin for j:=1 to 8 do begin doska[i,j]:=0; end; end; doska[2,6]:=1; doska[3,2]:=1; ...и т.д. массив типа Boolean только сначала обнуляешь весь массив, а затем проставляешь единички в нужных местах doska[2,6]:=1; где в квадратных скобках: 2-значение по Х(в нашем случае это буква B на доске), а 6-значение по Y. P.S. в свое время писал программу на Pascale в графическом режиме-шахматная доска, при щелке мыши по клетке, ставится ферзь, и показываються все поля находящиеся под боем, если интересует, исходный код остался. |
![]() |
![]() |
# 3 |
::VIP::
Регистрация: 17.02.2002
Адрес: /home/dr-evil
Пол: Male
Сообщения: 2 212
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Novoross
раскрою тайну, понятие процедуры условно, это фактически та же функция, но возвращающая нулевое значение (null, nil, etc)
__________________
Сеть - это диагноз... а сисадмин - состояние души. Питер! Все на сходку!!! | Обзоры порталов. Добавь свою любимую систему! |
![]() |
![]() |
# 4 |
Guest
Сообщения: n/a
|
Не совсем верно описанна задача, тоесть известно положение коней на доске, но нужен алгоритм перебора который мог бы его найти.
Сама идея такая: в одной четверти доски расстовляются фигуры(кони) по 3, причём крайние ряды можно "отбросить" * * * * * * х х * * х * * * * * это если брать левый нижний угол как а-1. Затем необходимо эту часть доски скопировать на другие три четверти, предварительно повернув относительно правого верхнего угла на 90 градусов. Таким образом получится вся доска и перебор соответственно можно ограничить только одной четвертью. Вся проблема как это реализовать на паскале. Спасибо |
![]() |
# 5 |
Junior Member
Регистрация: 03.02.2006
Сообщения: 160
![]() ![]() ![]() |
1. Если возиться только с одной четвертью, пропускается возможность "закрыть" некоторые клетки с соседней четверти.
2. А без этой возможности задача не решается. На отдельно взятую четверть доски, чтобы накрыть все свободные клетки, нужно ЧЕТЫРЕ коня. И на всю доску - 16. |
![]() |
![]() |
# 7 |
::VIP::
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Погодь, слушай, а можно вот так:
* * * * * * * * K * * K K * * K На этой картинке побиты все поля...четыре раза повторяем картинку и получаем все поле... единственно - не побиты ТЕ поля, на которых стоят кони... Если это правильно - то не понимаю задачи, может нужно указать все существующие кобинации? тогда берем матрицу 4*4, делаем там всевозможные комбинации, при которых побиты все поля (можно и перебором - это будет не долго), реализовывать это можно например так: ставим в клетку значение 2, все которые побиты ей - 1, оставшиеся - 0, в оставшиеся в любое место ставим соответственно опять 2 и т.д....В итоге получаем набор таких полей размера 4*4 со всеми побитыми полями, тогда чтобы воспроизвести поле достаточно склеить все мелкие поля, одновременно их крутя-вертя, тогда получатся все-возможные комбинации... Либо я что-то не так понял ![]()
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным. |
![]() |
![]() |
# 8 | |
Junior Member
Регистрация: 25.09.2004
Адрес: ніжин
Сообщения: 128
![]() ![]() |
Цитата:
![]() |
|
![]() |
![]() |
# 9 |
Guest
Сообщения: n/a
|
Алгоритм я уже искал, только ничего хорошего из этого не вышло, может просто не там искал. Сколько вариантов решения этой задачи ещё я не знаю, просто на бумажке прикидывал и получил который описан. Насчёт того что нельзя рассматривать только одну четверть это моя ошибка, сори. Может у кого-нибудь есть готовый алгоритм решения, свои мысли временно иссякли и напрявились на курсовую. Спасибо
|
![]() |
# 10 |
::VIP::
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
вот, кстати про 8 ферзей:
__http://recursio.narod.ru/quins.htm Вообще в яндексе по запросу 8 ферзей кучу всего выдает, а реализация твоих 12 коней такая же будет (приблизительно, как и 8 ферзей ![]() таксь, а про коней читаем здесь: __http://www.sciteclibrary.ru/cgi-bin/yabb/Printpage.cgi?board=golovolomki&num=1141055727 ![]()
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным. |
![]() |
![]() |
# 11 |
::VIP::
Регистрация: 10.07.2004
Адрес: Москва
Пол: Male
Сообщения: 2 030
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Перебор ИМХО штука несложная, но завершения работы такой проги долго ждать. Первого коня можно разместить 64 способами. Если он размещен, то 2-го уже 63 способами, третьего 62-мя и т.д.
Игого получается 64*63*62*61*60*...*53 вариантов. Так сказать Це из 64 по 12. Нехилое число получится ![]() А какие поля пробивает конь, стоящий на клетке (x,y) определить тоже несложно. Кони ходят буквой Г, следовательно подойдут клетки с координатами: (x-1,y-2), (x-2,y-1),(x+1,y-2),(x+2,y-1), (x+2,y+1), (x+1,y+2),(x-1,y+2),(x-2,y+1) при условии, что все координаты принадлежат шахматной доске, т.е. больше нуля и меньше 9. Количество переборов можно, наверное сократить, учитывая, что поскольку каждого коня должен бить какой-нибудь другой, то выбирать очередного достаточно лишь из клеток с координатами этой восьмерки. Ну и сократить перебор на первом шаге (не просматривать все 64 комбинации) можно, используя следующее соображение - клетку а1 должен кто-либо пробивать. А это может быть конь либо b3 либо c2. Последний раз редактировалось leon534; 29.04.2006 в 21:27. |
![]() |