10 февраля 2011 г.

Задача "Восемь Ферзей"

Matraska продолжает изучать алгоритмические задачи. На этот раз задача будет о Восьми ферзях (см. WikiPedia).
Эта задача, да и все подобные полезны тем, что позволяют отточить навыки кодинга, здорово поломать голову, и конечно научится новому.
Так на примере этой задачи небезызвестный автор этого труда познал приемы работы с двумерными массивами (до этого как то не доходили руки), почесал репу и не смог найти другого  алгоритма решения этой задачи, кроме как метода подбора... И в правду задача немного сложнее, а написанный на 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 ферзей!):

obj1=Eight_ferz.new()
obj1.start
obj1.show_board

Комментариев нет:

Отправить комментарий