Язык программирования: С#
Размещение 8 ладей на шахматной доске размером 8х8 так, чтобы ни одна ладья не угрожала другой.
Рекурсивная расстоновка фигур:
namespace Расстановка_ладей_рекурсия
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.RowCount = 8;
}
private void button1_Click(object sender, EventArgs e)
{
//Все ячейки таблицы делаем пустыми
for(int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
dataGridView1.Rows[i].Cells[j].Value = "";
//Объект, имитирующий шахматную доску
Board b = new Board();
//В этом массиве хранятся координаты установленнх ладей
int[,] pos = new int[8, 2];
//Этот массив содержит числа, указывающие сколько клеток
//будет "бить" ладья установленная на данную клетку доски.
//(чем меньше - тем лучше).
int[,] moves = new int[8, 8];//Это счётчик для каждой из 64 клеток
//-------------------------------------------------------------------
//Пробуем установить 8 ладей.
for (int k = 0; k < 8; k++)
{
//анализируем все клетки доски
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
moves[i,j] = b.TestSquare(i, j);
//Находим ячейку массива moves[] с минимальным значением,
//записываем координаты очередного хода в массив pos[].
FindMin(moves, ref pos[k, 0], ref pos[k, 1]);
//Пробуем выполнить ход
if ( b.SetQueen(pos[k, 0], pos[k, 1]) )
{
//Рисуем букву Л в соответствующей клетке таблицы
dataGridView1.Rows[pos[k, 1]].Cells[pos[k, 0]].Value = 'Л';
}
}
//------------------------------------------------------------------------
}
Эта функция определяет минимальный элемент массива moves (при этом не учитываются элементы == 0), и, если таких элементов оказалось несколько, случайным образом выбирает один из них. Этот элемент соответствует следующему ходу (x1, y1).
private void FindMin(int [,]m ,ref int x1,ref int y1)
{
int x = 0;
int y = 0;
int count = 0; //Количество элементов с минимальным значением
int min = 100;
//ищем наименьшие элементы и одновременно считаем
//их количество. При этом пропускаем элементы == 0
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
if (m[i,j] < min && m[i,j] != 0)
{
min = m[i,j];
x = i;
y = j;
count = 1;
}
else
if(m[i,j] == min)
count++;
//свободных клеток нет. Выводим соответствующее сообщение.
if (count == 0)
MessageBox.Show("Свободных клеток нет", "Ошибка");
else
{
//выбираем случайным образом ход в интервале от 0 до count
Random r = new Random();
count = r.Next(0, count);
//определляем координаты клетки, соответствующей
//выбранному ходу
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
{
if (m[i,j] == min && count == 0)
{
x = i;
y = j;
}
if (m[i,j] == min)
count--;
}
//передаем координаты выбранного хода
x1 = x;
y1 = y;
}
}
}
|