Я почти уверен, что для этого уже есть (оптимальный) алгоритм.Хотя я собираюсь предложить, как бы я подошел к этой проблеме, если бы мне пришлось.Если вы хотите обнаружить чек как можно быстрее, я считаю, что разумным шагом будет предварительный расчет и разделение работы на ячейки доски.Возможно, вы задаетесь вопросом: «Как я могу этого достичь?», А как насчет того, чтобы каждый раз, когда часть перемещается, она отмечала территорию, на которой находится часть угрозы?
Давайте предположим, что это наш класс Cell:
public class Cell{
private ArrayList<Piece> whiteThreats = new ArrayList<>();
private ArrayList<Piece> blackThreats = new ArrayList<>();
...
}
В этом классе будет 2 ArrayList
, в котором будут храниться части, которые угрожают ячейке.Несколько частей могут угрожать одной ячейке и для обеих сторон (белых и черных).Теперь каждый раз, когда ход фигуры должен выполнять два действия:
Найти ячейки, которым угрожала текущая фигура, и удалить ссылку из их списков.
Найдите и отметьте новые ячейки, которые теперь являются частью угрозы, и добавьте ссылку на их списки.
При этом каждая фигура должна немедленно знать, безопасна ли ячейка для нее.или нет, что можно легко проверить, проверив, пустой ArrayList
(для соответствующего цвета) или нет.Если ArrayList
команды противника имеет по крайней мере один объект внутри (что означает, что размер больше нуля), это означает, что команда противника угрожает этой ячейке.Таким образом, король теперь может обнаружить чек за O (1) раз.