Помогите исправить Алгоритм Ли на WindowsForm
Вот программа
Постоянно выдает такую ошибку
System.ArgumentOutOfRangeException: "Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index"
для этой строки if (matrix[y, x] != END && grid[x, y].Value == null)
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private const int SIZE = 10; // Размер сетки
private const int WALL = -1; // Обозначение стены
private const int START = 0; // Обозначение начала
private const int END = 1; // Обозначение конца
private int[,] matrix; // Матрица для представления сетки
private DataGridView grid; // DataGridView для отображения сетки
private Point startPoint = Point.Empty; // Точка начала
private Point endPoint = Point.Empty; // Точка конца
public Form1()
{
InitializeComponent();
InitializeMatrix(); // Инициализация матрицы
InitializeGrid(); // Инициализация DataGridView
}
private void InitializeMatrix()
{
matrix = new int[SIZE, SIZE];
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
{
matrix[i, j] = 0; // Инициализация матрицы нулями (проходимые ячейки)
}
}
}
private void InitializeGrid()
{
grid = new DataGridView
{
Location = new Point(10, 10),
Size = new Size(450, 450),
ColumnCount = SIZE,
RowCount = SIZE,
AllowUserToAddRows = false,
AllowUserToResizeColumns = false,
AllowUserToResizeRows = false,
RowHeadersVisible = false,
ColumnHeadersVisible = false,
DefaultCellStyle = new DataGridViewCellStyle { Alignment = DataGridViewContentAlignment.MiddleCenter }
};
foreach (DataGridViewColumn column in grid.Columns)
{
column.Width = 30;
}
foreach (DataGridViewRow row in grid.Rows)
{
row.Height = 30;
}
grid.CellValueChanged += Grid_CellValueChanged;
this.Controls.Add(grid);
}
private void Grid_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
int row = e.RowIndex;
int col = e.ColumnIndex;
if (int.TryParse(grid[col, row].Value?.ToString(), out int value))
{
matrix[row, col] = value;
if (value == WALL)
{
grid[col, row].Style.BackColor = Color.Black;
}
else if (value == START)
{
if (startPoint != Point.Empty)
{
grid[startPoint.Y, startPoint.X].Style.BackColor = DefaultBackColor;
}
startPoint = new Point(col, row);
grid[col, row].Style.BackColor = Color.Green;
}
else if (value == END)
{
if (endPoint != Point.Empty)
{
grid[endPoint.Y, endPoint.X].Style.BackColor = DefaultBackColor;
}
endPoint = new Point(col, row);
grid[col, row].Style.BackColor = Color.Red;
}
else
{
grid[col, row].Style.BackColor = DefaultBackColor;
}
}
}
private void start_Click(object sender, EventArgs e)
{
if (startPoint == Point.Empty || endPoint == Point.Empty)
{
MessageBox.Show("Пожалуйста, установите начальную и конечную точки.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
ExecuteLeeAlgorithm(); // Запуск алгоритма Ли
}
private void reset_Click(object sender, EventArgs e)
{
InitializeMatrix();
foreach (DataGridViewRow row in grid.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
cell.Value = "";
cell.Style.BackColor = DefaultBackColor;
}
}
startPoint = Point.Empty;
endPoint = Point.Empty;
}
private void ExecuteLeeAlgorithm()
{
Queue<Point> queue = new Queue<Point>();
queue.Enqueue(startPoint);
while (queue.Count > 0)
{
Point p = queue.Dequeue();
int x = p.X;
int y = p.Y;
int step = matrix[y, x] + 1;
CheckAndEnqueue(queue, x + 1, y, step);
CheckAndEnqueue(queue, x - 1, y, step);
CheckAndEnqueue(queue, x, y + 1, step);
CheckAndEnqueue(queue, x, y - 1, step);
}
TraceBackPath(); // Восстановление пути
}
private void TraceBackPath()
{
int x = endPoint.X;
int y = endPoint.Y;
int step = matrix[y, x];
while (step > 0)
{
grid[x, y].Style.BackColor = Color.Yellow;
if (IsValidStep(x + 1, y, step)) { x++; }
else if (IsValidStep(x - 1, y, step)) { x--; }
else if (IsValidStep(x, y + 1, step)) { y++; }
else if (IsValidStep(x, y - 1, step)) { y--; }
step--;
}
grid[startPoint.X, startPoint.Y].Style.BackColor = Color.Green;
grid[endPoint.X, endPoint.Y].Style.BackColor = Color.Red;
}
private void CheckAndEnqueue(Queue<Point> queue, int x, int y, int step)
{
if (IsValidCoordinate(x, y) && (matrix[y, x] == 0 || matrix[y, x] == END))
{
matrix[y, x] = step;
queue.Enqueue(new Point(x, y));
// Обновление текста ячейки в DataGridView
if (matrix[y, x] != END && grid[x, y].Value == null)
{
grid[x, y].Value = step.ToString();
}
}
}
private bool IsValidCoordinate(int x, int y)
{
return x >= 0 && x < SIZE && y >= 0 && y < SIZE;
}
private bool IsValidStep(int x, int y, int step)
{
return x >= 0 && x < SIZE && y >= 0 && y < SIZE && matrix[y, x] == step - 1; // Исправлено: правильное обращение к элементам матрицы
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
проблемы с выходом за диапазон я решил можете помочь с другой проблемой
private void reset_Click(object sender, EventArgs e)
{
InitializeMatrix();
foreach (DataGridViewRow row in grid.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
cell.Value = "";
// Не сбрасываем цвет ячейки
// cell.Style.BackColor = DefaultBackColor;
}
}
startPoint = Point.Empty;
endPoint = Point.Empty;
}
после того как я сбрасываю значения из ячеек они у меня не сбрасываются а просто окрашиваются и после этого при выполнение алгоритма Ли числа не видно видно только желтый путь мне надо что бы цвет в ячейках сбрасывался но так что бы было видно числа при последующем использовании алгоритма
Ответы (1 шт):
Метод reset_Click()
сбрасывает значения, но не изменяет цвета ячеек, что приводит к проблемам с видимостью.
Необходимо доработать метод reset_Click()
, чтобы он также изменял цвета ячеек на фоновый цвет по умолчанию.