Морской бой (расставить одиночные корабли) - Prolog
Формулировка задачи:
Вводим :show(10, [[S,2,8],[S,1,1],[S, 4, 7]])
получаем:
S _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ S _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ S _ _ _
_ _ _ _ _ _ _ _ _ _ , ну и дальше, 5 пустых рядов
Вот мой код:
Писал на Swi Prolog.
Что ни делал, застреваю на последней строчки
Помогите, люди добрые!
Листинг программы
- show(N,Figures):- show_index(Figures,N,N,1).
- show_index(_,_,0,0):-!.
- show_index(Figures,W,I,J):-member([F,I,J],Figures),!,write(' '),write(F), J1=J+1, show_index(Figures,W,I,J1).
- show_index(Figures,W,I,W1):- 1=W1-W,!,nl,I1=I-1,show_index(Figures,W,I1,0).
- show_index(Figures,W,I,J):-write(' -'), J1=J+1, show_index(Figures,W,I,J1).
Размерность я сохраняю, так как должна задаваться произвольно.
Решение задачи: «Морской бой (расставить одиночные корабли)»
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) и является начальной точкой для рекурсивного вызова функции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д