imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 26.04.2006, 22:03     # 1
Yurij
Member
 
Аватар для Yurij
 
Регистрация: 30.05.2003
Адрес: Литва
Пол: Male
Сообщения: 329

Yurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царствеYurij Луч света в тёмном царстве
Снова задачка по языку Pascal

Доброе время суток Гуру Pascalя.
Очень бы хотелось найти вот такую задачку:
Надо написать функцию, которая на шахматной доске расставит 12 коней так, чтобы они покрывали все другие клетки.
Как расставить фигуры, я знаю:
b6
c2
c3
c5
c6
d3
e6
f3
f4
f6
f7
g3
Проблема - это запрограмить как можно легче... без графики и других наворотов.
Большое спасибо!
Yurij вне форума  
Старый 27.04.2006, 14:05     # 2
Novoross
Junior Member
 
Регистрация: 29.09.2005
Сообщения: 99

Novoross Путь к славе только начался
Без графики, это только если представить шахматную доску в виде двумерной матрицы размером 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 в графическом режиме-шахматная доска, при щелке мыши по клетке, ставится ферзь, и показываються все поля находящиеся под боем, если интересует, исходный код остался.
Novoross вне форума  
Старый 27.04.2006, 17:35     # 3
dr-evil
::VIP::
 
Аватар для dr-evil
 
Регистрация: 17.02.2002
Адрес: /home/dr-evil
Пол: Male
Сообщения: 2 212

dr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэй
Novoross
раскрою тайну, понятие процедуры условно, это фактически та же функция, но возвращающая нулевое значение (null, nil, etc)
__________________
Сеть - это диагноз... а сисадмин - состояние души.
Питер! Все на сходку!!! | Обзоры порталов. Добавь свою любимую систему!
dr-evil вне форума  
Старый 27.04.2006, 19:19     # 4
lost__
Guest
 
Сообщения: n/a

Не совсем верно описанна задача, тоесть известно положение коней на доске, но нужен алгоритм перебора который мог бы его найти.
Сама идея такая:
в одной четверти доски расстовляются фигуры(кони) по 3, причём крайние ряды можно "отбросить"
* * * *
* * х х
* * х *
* * * *
это если брать левый нижний угол как а-1.
Затем необходимо эту часть доски скопировать на другие три четверти, предварительно повернув относительно правого верхнего угла на 90 градусов. Таким образом получится вся доска и перебор соответственно можно ограничить только одной четвертью. Вся проблема как это реализовать на паскале.
Спасибо
 
Старый 28.04.2006, 16:26     # 5
XPEHOMETP
Junior Member
 
Регистрация: 03.02.2006
Сообщения: 160

XPEHOMETP МолодецXPEHOMETP МолодецXPEHOMETP Молодец
1. Если возиться только с одной четвертью, пропускается возможность "закрыть" некоторые клетки с соседней четверти.

2. А без этой возможности задача не решается. На отдельно взятую четверть доски, чтобы накрыть все свободные клетки, нужно ЧЕТЫРЕ коня. И на всю доску - 16.
XPEHOMETP вне форума  
Старый 28.04.2006, 18:59     # 6
topknot
Junior Member
 
Регистрация: 25.09.2004
Адрес: ніжин
Сообщения: 128

topknot Известность не заставит себя ждатьtopknot Известность не заставит себя ждать
Очевидно, преподаватель хочет, чтобы ты решил задачу с помощью рекурсии.
topknot вне форума  
Старый 28.04.2006, 19:37     # 7
Naked
::VIP::
 
Аватар для Naked
 
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194

Naked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked Сэнсэй
Погодь, слушай, а можно вот так:
* * * *
* * * *
K * * K
K * * K
На этой картинке побиты все поля...четыре раза повторяем картинку и получаем все поле... единственно - не побиты ТЕ поля, на которых стоят кони...
Если это правильно - то не понимаю задачи, может нужно указать все существующие кобинации? тогда берем матрицу 4*4, делаем там всевозможные комбинации, при которых побиты все поля (можно и перебором - это будет не долго), реализовывать это можно например так: ставим в клетку значение 2, все которые побиты ей - 1, оставшиеся - 0, в оставшиеся в любое место ставим соответственно опять 2 и т.д....В итоге получаем набор таких полей размера 4*4 со всеми побитыми полями, тогда чтобы воспроизвести поле достаточно склеить все мелкие поля, одновременно их крутя-вертя, тогда получатся все-возможные комбинации... Либо я что-то не так понял
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным.
Naked вне форума  
Старый 28.04.2006, 21:56     # 8
topknot
Junior Member
 
Регистрация: 25.09.2004
Адрес: ніжин
Сообщения: 128

topknot Известность не заставит себя ждатьtopknot Известность не заставит себя ждать
Цитата:
The_naked:
Либо я что-то не так понял
а каким конем побить правую верхнюю клетку твоего рисунка. И коней будет не 12 если сложить четыре таких куска как у тебя, это уже в теме обсуждалось. Это, имхо, хрестоматийный пример задачи, которая решается рекурсией. Можно поискать материал по ключевым словам "задача про 8 ферзей" если "12 коней" не помогают.
topknot вне форума  
Старый 28.04.2006, 23:02     # 9
lost__
Guest
 
Сообщения: n/a

Алгоритм я уже искал, только ничего хорошего из этого не вышло, может просто не там искал. Сколько вариантов решения этой задачи ещё я не знаю, просто на бумажке прикидывал и получил который описан. Насчёт того что нельзя рассматривать только одну четверть это моя ошибка, сори. Может у кого-нибудь есть готовый алгоритм решения, свои мысли временно иссякли и напрявились на курсовую. Спасибо
 
Старый 28.04.2006, 23:26     # 10
Naked
::VIP::
 
Аватар для Naked
 
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194

Naked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked Сэнсэй
вот, кстати про 8 ферзей:
__http://recursio.narod.ru/quins.htm
Вообще в яндексе по запросу 8 ферзей кучу всего выдает, а реализация твоих 12 коней такая же будет (приблизительно, как и 8 ферзей )
таксь, а про коней читаем здесь:
__http://www.sciteclibrary.ru/cgi-bin/yabb/Printpage.cgi?board=golovolomki&num=1141055727
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным.
Naked вне форума  
Старый 29.04.2006, 21:08     # 11
leon534
::VIP::
 
Аватар для leon534
 
Регистрация: 10.07.2004
Адрес: Москва
Пол: Male
Сообщения: 2 030

leon534 Простой бог
leon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой богleon534 Простой бог
Перебор ИМХО штука несложная, но завершения работы такой проги долго ждать. Первого коня можно разместить 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.
leon534 вне форума  
Старый 02.05.2006, 09:02     # 12
MrSerg
Guest
 
Сообщения: n/a

Задачка понравилась, решил просто написать всю программу поиска вариантов.
Вот что получилось на Delphi7.
Находит ваш вариант за несколько секунд, методом перебора вариантов и выбора наилучшего.
Вложения
Тип файла: txt cony.txt (3.6 Кбайт, 15 просмотров - Кто скачивал? )
 


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 08:21.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.