Помогите исправить Алгоритм Ли на 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 шт):

Автор решения: goodstealing

Метод reset_Click() сбрасывает значения, но не изменяет цвета ячеек, что приводит к проблемам с видимостью.

Необходимо доработать метод reset_Click(), чтобы он также изменял цвета ячеек на фоновый цвет по умолчанию.

→ Ссылка