Эта задача, да и все подобные полезны тем, что позволяют отточить навыки кодинга, здорово поломать голову, и конечно научится новому.
Так на примере этой задачи небезызвестный автор этого труда познал приемы работы с двумерными массивами (до этого как то не доходили руки), почесал репу и не смог найти другого алгоритма решения этой задачи, кроме как метода подбора... И в правду задача немного сложнее, а написанный на ruby код немного объемнее, чем реализации этой задачи других авторов на C, Basic и прочих языках, которые удалось найти при не продолжительном поиске по Гуглю.
class Eight_ferz
attr_reader :chease_board
def initialize()
#Создаем многомерный массив
@chease_board = Array.new(8)
@chease_board.map! { Array.new(8,0) }# Инициализируем массив 0-ми
end
#Метод демонстрирующий всю доску
def show_board
@chease_board.each do |row|
p row
end
end
# Метод устанавливающий фигуру на шахматной доске
# n- номер строки, m - номер столбца
def set_figure(n,m)
# Устанавливаем 1 (замораживаем точки) по ортогональным линиям шахмотной доски
(0..7).each{|index| @chease_board[n][index]=@chease_board[index][m]=1}
# Рассматриваем 4 ю четверть СК(центр СК точка n,m)
n4,m4=n,m
#puts("n: #{n4}, m: #{m4}")
while (n4<8&&m4<8)
@chease_board[n4][m4]=1
n4+=1;
m4+=1
#puts("n: #{n4}, m: #{m4}")
end
n1,m1=n,m
while(n1>=0&&m1<8)
@chease_board[n1][m1]=1
n1-=1;
m1+=1
end
n2,m2=n,m
while(n2>=0&&m2>=0)
@chease_board[n2][m2]=1
n2-=1
m2-=1
end
n3,m3=n,m
while(n3<8&&m3>=0)
@chease_board[n3][m3]=1
n3+=1
m3-=1
end
@chease_board[n][m]=2;
end
def free_positions()
free_pos=Array.new()
# Перебираем все позиции, если равен 0 в массив
(0..7).each do|n|
(0..7).each do |m|
if @chease_board[n][m]==0
#puts("N[#{n}], M[#{m}]")
free_pos<<[n,m]
end
end
end
# В качестве ответа метода выводим координаты выбранной точки и кол-во свободных позиций
if free_pos.size>0
free_pos[rand(free_pos.size-1)]<<free_pos.size
else
nil
end
end
# Решение методом перебора(может заполнить доску 5-8 ферзями!)
def start
count=0
current_position=self.free_positions()# получаем координаты позицию на которую можно поставить ферзя
while (!current_position.nil?)
self.set_figure(current_position[0],current_position[1]) # устанавливаем ферзя
current_position=self.free_positions() #
count+=1
end
puts("Count #{count}")
end
endSyhi-подсветка кода
Пример вызова (может быть от 5-до 8 ферзей!):attr_reader :chease_board
def initialize()
#Создаем многомерный массив
@chease_board = Array.new(8)
@chease_board.map! { Array.new(8,0) }# Инициализируем массив 0-ми
end
#Метод демонстрирующий всю доску
def show_board
@chease_board.each do |row|
p row
end
end
# Метод устанавливающий фигуру на шахматной доске
# n- номер строки, m - номер столбца
def set_figure(n,m)
# Устанавливаем 1 (замораживаем точки) по ортогональным линиям шахмотной доски
(0..7).each{|index| @chease_board[n][index]=@chease_board[index][m]=1}
# Рассматриваем 4 ю четверть СК(центр СК точка n,m)
n4,m4=n,m
#puts("n: #{n4}, m: #{m4}")
while (n4<8&&m4<8)
@chease_board[n4][m4]=1
n4+=1;
m4+=1
#puts("n: #{n4}, m: #{m4}")
end
n1,m1=n,m
while(n1>=0&&m1<8)
@chease_board[n1][m1]=1
n1-=1;
m1+=1
end
n2,m2=n,m
while(n2>=0&&m2>=0)
@chease_board[n2][m2]=1
n2-=1
m2-=1
end
n3,m3=n,m
while(n3<8&&m3>=0)
@chease_board[n3][m3]=1
n3+=1
m3-=1
end
@chease_board[n][m]=2;
end
def free_positions()
free_pos=Array.new()
# Перебираем все позиции, если равен 0 в массив
(0..7).each do|n|
(0..7).each do |m|
if @chease_board[n][m]==0
#puts("N[#{n}], M[#{m}]")
free_pos<<[n,m]
end
end
end
# В качестве ответа метода выводим координаты выбранной точки и кол-во свободных позиций
if free_pos.size>0
free_pos[rand(free_pos.size-1)]<<free_pos.size
else
nil
end
end
# Решение методом перебора(может заполнить доску 5-8 ферзями!)
def start
count=0
current_position=self.free_positions()# получаем координаты позицию на которую можно поставить ферзя
while (!current_position.nil?)
self.set_figure(current_position[0],current_position[1]) # устанавливаем ферзя
current_position=self.free_positions() #
count+=1
end
puts("Count #{count}")
end
endSyhi-подсветка кода
obj1=Eight_ferz.new()
obj1.start
obj1.show_board
Комментариев нет:
Отправить комментарий