Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 14.06.2015
Сообщений: 7
1

8 ферзей

14.06.2015, 21:28. Показов 2015. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Помогите пожалуйста разобраться с написанием задачи.

Много подобных тем было на форуме, мне не подходят решения которые я там нашел; требования в универе не высокие, поэтому нужно компактно написать код простыми методами.

Имеется Prolog решение (по Братко), нужно написать также просто на LISPe:

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
queen(S):-
    permutation([1,2,3,4,5,6,7,8],S),
    safely(S).
 
safely([]).
safely([S|T]):- safely(T), nobeats(S,T,1).
 
nobeats(_,[],_).
nobeats(Y,[Y1|S1],X):-
    Y1-Y =\= X,
    Y-Y1 =\= X,
    X1 is X + 1,
    nobeats(Y,S1,X1).
Есть наработки, но мне трудно дается понимание вывода результата и не могу найти встроенную функцию перестановки списка:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun nobeats ( Y lst X )
  (setq Y1 (car lst)) (not(eq(- Y1 Y) X)) (not(eq (- Y Y1 ) X)) (setq X1 (+ X 1)) (nobeats Y (cdr lst) X1) )
 
(defun safely ( lst ) 
  (cond ( (null lst) nil)
  ( t (safely (cdr lst)) (nobeats (car lst) (cdr lst) 1)) ))
 
(defun permut (list)
  (cond ((null list) nil)
        ((null (cdr list)) (list list))
        (t (loop for element in list
             append (mapcar (lambda (l) (cons element l))
                            (permut (remove element list)))))))
(defun queen ( lst )
  (cond ( (null lst) nil)
        ( t (safely (permut '(1 2 3 4 5 6 7 8))) ) ))
Чтобы были понятны требования привожу пример одной из лабораторных работ, успешно защищенной(решения на PROLOG и LISP):
Задача о разделении списка на 3 подсписка (меньше заданного числа, больше и равных)
Prolog
1
2
3
4
5
div([],_,[],[],[]).                              
 
div([H|T],X,[H|T1],L2,L3):-H<X,div(T,X,T1,L2,L3),!. 
div([H|T],X,L1,[H|T2],L3):-H=X,div(T,X,L1,T2,L3),!. 
div([H|T],X,L1,L2,[H|T3]):-div(T,X,L1,L2,T3).
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(defun equ ( lst x  )
  (cond ( (null lst) nil)
        ( (eq x (car lst))  (cons (car lst) (equ (cdr lst) x)) )
        ( t (equ (cdr lst) x) ) ))
 
(defun big ( lst x  )
  (cond ( (null lst) nil)
        ( (< x (car lst))  (cons (car lst) (big (cdr lst) x)) )
        ( t (big (cdr lst) x) ) ))
 
(defun less ( lst x  )
  (cond ( (null lst) nil)
        ( (> x (car lst))  (cons (car lst) (less (cdr lst) x)) )
        ( t (less (cdr lst) x) ) ))
 
(defun div ( lst x  )
  (cond ( (null lst) nil)
        ( t (list  (less lst x) (equ lst x) (big lst x) )) ))
Заранее спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2015, 21:28
Ответы с готовыми решениями:

Расположить на шахматной доске 8 ферзей
Доброго времени суток! Помогите, пожалуйста, с решением: Расположить на шахматной доске 8 ферзей...

Задача про ферзей (расставить n ферзей так, чтобы они не били друг друга)
помогите,пожалуйста,с задачей, битый час сижу над ней-ничего не получается:пользователь задает...

Получить m расстановок 8 ферзей на шахматной доске, при которых ни один из ферзей не угрожает другому
10. Дано натуральное число m. Получить m расстановок 8 ферзей на шахматной доске, при которых ни...

Расставить на доске максимальное число ферзей так, чтобы каждый из них нападал ровно на р ферзей
3. Расставить на доске N×N максимальное число ферзей так, чтобы каждый из них нападал ровно на р...

5
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
15.06.2015, 00:43 2
Лучший ответ Сообщение было отмечено Shelb как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(def solve (macro ()
    (def c-step-vars (macro (c) (cond (> c 8) "win" (
        (def rds nil)
        (def add-rds (macro (_c _r)
            (set! rds (cons (+ _r (- _c c)) (cons (+ _r (- c _c)) (cons _r rds))))))
        (def i 1) (while (< i c) (add-rds i (eval (++ "a" i))) (set! i (+ i 1)))
        (filter (lambda (e) (noelem e rds)) '(1 2 3 4 5 6 7 8))))))
 
    (def find-solution (macro (col) (
        (def step-vars (c-step-vars col))
        (cond (eq? "win" step-vars)
                  ((def col-names '("a" "b" "c" "d" "e" "f" "g" "h"))
                  (def i 1) (while (< i 9)
                      (print (car col-names)) (print (eval (++ "a" i))) (print " ")
                      (set! col-names (cdr col-names)) (set! i (+ i 1)))
                  (printLn ""))
            (map (lambda (v) (name-def (++ "a" col) v)
                             (find-solution (+ 1 col))) step-vars)))))
    (find-solution 1) ))
 
(printLn "Решения:") (solve) (printLn "Конец")
Код
Решения:
a1 b5 c8 d6 e3 f7 g2 h4 
a1 b6 c8 d3 e7 f4 g2 h5 
a1 b7 c4 d6 e8 f2 g5 h3 
a1 b7 c5 d8 e2 f4 g6 h3 
a2 b4 c6 d8 e3 f1 g7 h5 
a2 b5 c7 d1 e3 f8 g6 h4 
a2 b5 c7 d4 e1 f8 g6 h3 
a2 b6 c1 d7 e4 f8 g3 h5 
a2 b6 c8 d3 e1 f4 g7 h5 
a2 b7 c3 d6 e8 f5 g1 h4 
a2 b7 c5 d8 e1 f4 g6 h3 
a2 b8 c6 d1 e3 f5 g7 h4 
a3 b1 c7 d5 e8 f2 g4 h6 
a3 b5 c2 d8 e1 f7 g4 h6 
a3 b5 c2 d8 e6 f4 g7 h1 
a3 b5 c7 d1 e4 f2 g8 h6 
a3 b5 c8 d4 e1 f7 g2 h6 
a3 b6 c2 d5 e8 f1 g7 h4 
a3 b6 c2 d7 e1 f4 g8 h5 
a3 b6 c2 d7 e5 f1 g8 h4 
a3 b6 c4 d1 e8 f5 g7 h2 
a3 b6 c4 d2 e8 f5 g7 h1 
a3 b6 c8 d1 e4 f7 g5 h2 
a3 b6 c8 d1 e5 f7 g2 h4 
a3 b6 c8 d2 e4 f1 g7 h5 
a3 b7 c2 d8 e5 f1 g4 h6 
a3 b7 c2 d8 e6 f4 g1 h5 
a3 b8 c4 d7 e1 f6 g2 h5 
a4 b1 c5 d8 e2 f7 g3 h6 
a4 b1 c5 d8 e6 f3 g7 h2 
a4 b2 c5 d8 e6 f1 g3 h7 
a4 b2 c7 d3 e6 f8 g1 h5 
a4 b2 c7 d3 e6 f8 g5 h1 
a4 b2 c7 d5 e1 f8 g6 h3 
a4 b2 c8 d5 e7 f1 g3 h6 
a4 b2 c8 d6 e1 f3 g5 h7 
a4 b6 c1 d5 e2 f8 g3 h7 
a4 b6 c8 d2 e7 f1 g3 h5 
a4 b6 c8 d3 e1 f7 g5 h2 
a4 b7 c1 d8 e5 f2 g6 h3 
a4 b7 c3 d8 e2 f5 g1 h6 
a4 b7 c5 d2 e6 f1 g3 h8 
a4 b7 c5 d3 e1 f6 g8 h2 
a4 b8 c1 d3 e6 f2 g7 h5 
a4 b8 c1 d5 e7 f2 g6 h3 
a4 b8 c5 d3 e1 f7 g2 h6 
a5 b1 c4 d6 e8 f2 g7 h3 
a5 b1 c8 d4 e2 f7 g3 h6 
a5 b1 c8 d6 e3 f7 g2 h4 
a5 b2 c4 d6 e8 f3 g1 h7 
a5 b2 c4 d7 e3 f8 g6 h1 
a5 b2 c6 d1 e7 f4 g8 h3 
a5 b2 c8 d1 e4 f7 g3 h6 
a5 b3 c1 d6 e8 f2 g4 h7 
a5 b3 c1 d7 e2 f8 g6 h4 
a5 b3 c8 d4 e7 f1 g6 h2 
a5 b7 c1 d3 e8 f6 g4 h2 
a5 b7 c1 d4 e2 f8 g6 h3 
a5 b7 c2 d4 e8 f1 g3 h6 
a5 b7 c2 d6 e3 f1 g4 h8 
a5 b7 c2 d6 e3 f1 g8 h4 
a5 b7 c4 d1 e3 f8 g6 h2 
a5 b8 c4 d1 e3 f6 g2 h7 
a5 b8 c4 d1 e7 f2 g6 h3 
a6 b1 c5 d2 e8 f3 g7 h4 
a6 b2 c7 d1 e3 f5 g8 h4 
a6 b2 c7 d1 e4 f8 g5 h3 
a6 b3 c1 d7 e5 f8 g2 h4 
a6 b3 c1 d8 e4 f2 g7 h5 
a6 b3 c1 d8 e5 f2 g4 h7 
a6 b3 c5 d7 e1 f4 g2 h8 
a6 b3 c5 d8 e1 f4 g2 h7 
a6 b3 c7 d2 e4 f8 g1 h5 
a6 b3 c7 d2 e8 f5 g1 h4 
a6 b3 c7 d4 e1 f8 g2 h5 
a6 b4 c1 d5 e8 f2 g7 h3 
a6 b4 c2 d8 e5 f7 g1 h3 
a6 b4 c7 d1 e3 f5 g2 h8 
a6 b4 c7 d1 e8 f2 g5 h3 
a6 b8 c2 d4 e1 f7 g5 h3 
a7 b1 c3 d8 e6 f4 g2 h5 
a7 b2 c4 d1 e8 f5 g3 h6 
a7 b2 c6 d3 e1 f4 g8 h5 
a7 b3 c1 d6 e8 f5 g2 h4 
a7 b3 c8 d2 e5 f1 g6 h4 
a7 b4 c2 d5 e8 f1 g3 h6 
a7 b4 c2 d8 e6 f1 g3 h5 
a7 b5 c3 d1 e6 f8 g2 h4 
a8 b2 c4 d1 e7 f5 g3 h6 
a8 b2 c5 d3 e1 f7 g4 h6 
a8 b3 c1 d6 e2 f5 g7 h4 
a8 b4 c1 d3 e6 f2 g7 h5 
Конец
Добавлено через 1 час 7 минут
Чисто функциональный вариант, на макросовых мапах - иначе нет доступа к переменным окружения вызова. Чувствую, надо сделать еще один колл-конвеншенс для лямбды, вычисляющей аргументы, но не создающей замыкания контекста создания.
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(def solve (macro ()
    (def map-m (macro (f _l) (cond (null? _l) nil (cons (f (car _l)) (map-m f (cdr _l))))))
    (def find-solution (macro (col)
        (cond (> col 8)
            ((map-m (macro (i)
                (print (list-ref (- i 1) '("a" "b" "c" "d" "e" "f" "g" "h")))
                (print (eval (++ "a" i))) (print " ")) '(1 2 3 4 5 6 7 8))
                (printLn ""))
 
            ((def add-rds (macro (_c _r)
                (cons (+ _r (- _c col)) (cons (+ _r (- col _c)) _r))))
            (def rds (concat (map-m (macro (i) (add-rds i (eval (++ "a" i))))
                (list-from-to 1 (- col 1)))))
            (map-m (lambda (v) (name-def (++ "a" col) v) (find-solution (+ 1 col)))
                (filter (lambda (e) (noelem e rds)) '(1 2 3 4 5 6 7 8))))
    )))
    (find-solution 1) ))
4
1050 / 944 / 107
Регистрация: 04.11.2012
Сообщений: 974
Записей в блоге: 3
15.06.2015, 15:20 3
Не подошло ?
0
0 / 0 / 0
Регистрация: 14.06.2015
Сообщений: 7
16.06.2015, 14:46  [ТС] 4
_Ivana, спасибо, но честно - для меня сложновато, прогаем на примитивном уровне и предмет нам не объясняли (преподаватель отнекивался при попытке узнать больше и говорил что мы мол это проходили и сами давайте разбирайте)

Добавлено через 15 минут
Lambdik, нет, я бы не задавал вопроса)
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
16.06.2015, 15:27 5
Хорошо, как вы себе представляете что в этой ситуации можно сделать? Примеры готовых решений вам показали в нескольких вариантах. Или вы хотите "попроще", чтобы написать в коде "компьютер, реши мне задачу о 8 ферзях" а он вам выдал все 92 варианта ответа? Гугл так работает, например.
1
0 / 0 / 0
Регистрация: 14.06.2015
Сообщений: 7
16.06.2015, 15:42  [ТС] 6
_Ivana, сел за учебник, огромное Вам спасибо за помощь!
0
16.06.2015, 15:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2015, 15:42
Помогаю со студенческими работами здесь

Расставить на доске N ферзей так, чтобы наибольшее число ее полей оказалось вне боя ферзей
1.Расставить на доске N×N (N&lt;=12) N ферзей так, чтобы наибольшее число ее полей оказалось вне боя...

8 ферзей
Вообщем мне нужно проработать тему бэктрекинга(поиска с возвратом) на прологе. Думаю лучшим...

8 ферзей
program ferz; uses crt,ABCObjects,ABCChessObjects,Events,Utils; var s,i,j:integer; a:array of...

8 ферзей
Здравствуйте. Пыталась реализовать задачу о 8 ферзях. Программа написана на С++. В принципе задача...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru