Морской бой (расставить одиночные корабли) - Prolog
Формулировка задачи:
Вводим :show(10, [[S,2,8],[S,1,1],[S, 4, 7]])
получаем:
S _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ S _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ S _ _ _
_ _ _ _ _ _ _ _ _ _ , ну и дальше, 5 пустых рядов
Вот мой код:
Писал на Swi Prolog.
Что ни делал, застреваю на последней строчки
Помогите, люди добрые!
Размерность я сохраняю, так как должна задаваться произвольно.
Решение задачи: «Морской бой (расставить одиночные корабли)»
textual
Листинг программы
show(N, Figures):- show_index(Figures, 1, 1, N). get_symbol(Figures, I, J, F):- member([F, I, J], Figures), !. get_symbol(_, _, _, '-'). show_index(_, I, _, N):- I > N, !. show_index(Figures, I, J, N):- J > N, !, nl, I1 is I+1, show_index(Figures, I1, 1, N). show_index(Figures, I, J, N):- get_symbol(Figures, I, J, F), write(' '), write(F), J1 is J+1, show_index(Figures, I, J1, N).
Объяснение кода листинга программы
- В первой строке кода определена функция show(N, Figures), которая выводит расположение кораблей в виде фигур на игральной доске размером NxN.
- Вторая строка кода вызывает функцию show_index(Figures, 1, 1, N), которая выводит первую фигуру (корабль) на позиции (1,1) и является начальной точкой для рекурсивного вызова функции.
- Третья строка кода определяет функцию get_symbol(Figures, I, J, F), которая проверяет, есть ли символ F на позиции (I,J) в списке фигур Figures. Если символ найден, функция возвращает true, в противном случае возвращает false.
- Четвертая строка кода определяет символ '-' как отдельный случай для функции get_symbol.
- Пятая строка кода определяет функцию showindex(Figures, I, , N), которая проверяет, если позиция I больше N, то есть если мы вышли за пределы доски, то возвращает false и прерывает выполнение функции.
- Шестая строка кода вызывает функцию get_symbol(Figures, I, J, F), которая выводит символ F на позиции (I,J) и является начальной точкой для рекурсивного вызова функции.
- Седьмая строка кода определяет переменную J1 как J+1.
- Восьмая строка кода вызывает функцию show_index(Figures, I, J1, N), которая выводит символ F на следующей позиции (I,J+1) и является начальной точкой для рекурсивного вызова функции.
- Девятая строка кода определяет функцию show_index(Figures, I, J, N), которая выводит символ F на позиции (I,J) и является начальной точкой для рекурсивного вызова функции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д