![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 07.03.2011
Сообщений: 4
|
![]()
Народ, помогите решить задачу.
Задача, во многом, известная: нужно разместить 8 ферзей на шахматной доске, чтобы они не били друг друга. НО: обязательно использование рекурсии + пользователь вводит номер строки и столбца одной из клеток и указывает её значение (0, если оставить клетку пустой, и 1, если поместить в неё ферзя). Соответственно, на выходе выводится матрица с 0-ми и 1-ми. Определенные наработки есть, но толку от них чуть. Нужен код на С++ и Pascal. Заранее спасибо. |
![]() |
![]() |
![]() |
#2 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
![]()
прилагай наработки и излагай конкретно в чем проблема. В интернетах можно найти эту задачу уже решенной, может быть, за исключением:
Цитата:
Код:
при установке ферзя и при его снятии с доски нужно разметить клетки, которые он бьет. структура клетки может быть такой: Код:
Но для тип=1 - это очень удобно, вместо матрицы с 0 и 1 будет матрица с 0 и разными числами )) это упрощает процесс снимания ферзя с доски, когда снимаешь ферзя - надо отметить клетки, которые он бил (потому что после снятия он их не бьет, а значит в них можно что-нибудь поставить). Возможна ситуация когда несколько ферзей бью одну клетку, если в этом случае мы используем матрицу из 0 и 1 - то чтобы правильно отметить битые клетки - надо снять ферзя, отметить все пустые клетки доски как небитые, перебрать все оставшиеся на доске фигуры и отметить для каждой клетки, которые она бьет. Если же считать число фигур, которые бьют клетку - то после съема фигуры достаточно уменьшить это значение(value) на единицу для всех клеток, котоыре била эта фигура. Последний раз редактировалось Stilet; 08.03.2011 в 12:03. |
|
![]() |
![]() |
![]() |
#3 | ||||
Регистрация: 07.03.2011
Сообщений: 4
|
![]() Цитата:
Цитата:
Цитата:
Цитата:
Последний раз редактировалось dessaber; 08.03.2011 в 10:46. Причина: Добавление сообщения |
||||
![]() |
![]() |
![]() |
#4 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
![]()
dessaber
если текущие координаты клетки поля это (i,j) то координаты следующей клетки поля это (i,j+1) если j+1<n или(i+1,0) если j+1>=n. снимать ферзя надо, т.к. используется перебор с возвратами, т.е. фактически перебираются вообще все варианты размещения ферзей. Могу написать вам программу за не большое материальное вознаграждение - обращайтесь ICQ 395-546-218,почта [ник на форуме]@mail.ru, или выкладывайте свои конкретные попытки(не копипаст из интернетов) и конкретные вопросы. |
![]() |
![]() |
![]() |
#5 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
![]()
вот проверка возможности установки ферзя:
Код:
t[i][j].type = 1 если в клетке i,j стоит фигура После установки ферзя надо пометить клетки которые он бьет, для этого можно исопльзовать что-то вроде: Код:
|
![]() |
![]() |
![]() |
#6 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
![]()
во второй функции flag = 1 если устанавливаем ферзя, и -1 если снимаем ферзя ))
а кроме разметки надо отметить клетку, непосредственно в которой стоит фигура: Код:
t[ii][jj].damage=c; означает что в этом поле может хранится тип фигуры, т.е. вызов может быть примерно такой: setFigure(ii,jj,'R',flag) значит что в клетку ii,jj ставим фигуру(type=1) с value='R' Последний раз редактировалось rrrFer; 08.03.2011 в 12:21. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Задача в Pascal | dimusiko | Помощь студентам | 1 | 13.01.2011 22:06 |
Задача Pascal | sizoichel | Помощь студентам | 0 | 23.12.2010 20:54 |
Задача в Pascal | Remi | Помощь студентам | 2 | 29.10.2010 21:17 |