Ладья - бэктрекинг, не могу найти утечку памяти (и нормальный код)

Сама задача: Найти кратчайший по количеству ходов путь ладьи позволяющий попасть из одной клетки в другую. Известно расположение белых и черных фигур на доске. Фигуры противоположного цвета можно бить. При запуске программа выдает утечку после инициализации всех элементов. Ненавижу задачи на шахматы, поэтому код был реализован вот так:

//Функция
void MoveTo(int** CB, Point R, Point P, dir a,int N) 
{
    if (R.x == P.x && R.y == P.y)
    {
        if (abs(amount - minimum) < min) 
            min = abs(amount - minimum);
    }
    else
    {
        if (a == UP)
        {
            while (CB[R.x - 1][R.y] != 1 && CB[R.x - 1][R.y] != 2 && R.x != P.x && R.x != 0)
                R.x--;
            if (CB[R.x - 1][R.y] == 1)
            {
                amount++;
                MoveTo(CB, R, P, DOWN,N);
                MoveTo(CB, R, P, LEFT,N);
                MoveTo(CB, R, P, RIGHT,N);
                amount--;
            }
            else if (CB[R.x - 1][R.y] == 2)
            {
                R.x--;
                amount++;
                MoveTo(CB, R, P, UP,N);
                MoveTo(CB, R, P, DOWN,N);
                MoveTo(CB, R, P, LEFT,N);
                MoveTo(CB, R, P, RIGHT,N);
                amount--;
            }
            else if (R.x == 0)
            {
                amount++;
                MoveTo(CB, R, P, DOWN,N);
                MoveTo(CB, R, P, LEFT,N);
                MoveTo(CB, R, P, RIGHT,N);
                amount--;
            }
            else if (R.x == P.x)
            {
                if (R.y < P.y)
                {
                    amount++;
                    MoveTo(CB, R, P, RIGHT,N);
                    amount--;
                }
                else
                {
                    amount++;
                    MoveTo(CB, R, P, LEFT,N);
                    amount--;
                }
            }
        }
        else if (a==DOWN)
        {
            while (CB[R.x + 1][R.y] != 1 && CB[R.x + 1][R.y] != 2 && R.x != P.x && R.x != N-1)
                R.x++;
            if (CB[R.x + 1][R.y] == 1)
            {
                amount++;
                MoveTo(CB, R, P, UP,N);
                MoveTo(CB, R, P, LEFT,N);
                MoveTo(CB, R, P, RIGHT,N);
                amount--;
            }
            else if (CB[R.x + 1][R.y] == 2)
            {
                R.x++;
                amount++;
                MoveTo(CB, R, P, DOWN,N);
                MoveTo(CB, R, P, UP,N);
                MoveTo(CB, R, P, LEFT,N);
                MoveTo(CB, R, P, RIGHT,N);
                amount--;
            }
            else if (R.x == N-1)
            {
                amount++;
                MoveTo(CB, R, P, UP,N);
                MoveTo(CB, R, P, LEFT,N);
                MoveTo(CB, R, P, RIGHT,N);
                amount--;
            }
            else if (R.x == P.x)
            {
                if (R.y < P.y)
                {
                    amount++;
                    MoveTo(CB, R, P, RIGHT,N);
                    amount--;
                }
                else
                {
                    amount++;
                    MoveTo(CB, R, P, LEFT,N);
                    amount--;
                }
            }
        }
        else if (a==RIGHT)
        {
            while (CB[R.x][R.y+1] != 1 && CB[R.x][R.y+1] != 2 && R.y != P.y && R.y != N - 1)
                R.y++;
            if (CB[R.x][R.y+1] == 1)
            {
                amount++;
                MoveTo(CB, R, P, UP,N);
                MoveTo(CB, R, P, DOWN,N);
                MoveTo(CB, R, P, LEFT,N);
                amount--;
            }
            else if (CB[R.x][R.y + 1] == 2)
            {
                R.y++;
                amount++;
                MoveTo(CB, R, P, UP,N);
                MoveTo(CB, R, P, DOWN,N);
                MoveTo(CB, R, P, RIGHT,N);
                MoveTo(CB, R, P, LEFT,N);
                amount--;
            }
            else if (R.y == N-1)
            {
                amount++;
                MoveTo(CB, R, P, UP,N);
                MoveTo(CB, R, P, DOWN,N);
                MoveTo(CB, R, P, LEFT,N);
                amount--;
            }
            else if (R.y == P.y)
            {
                if (R.x < P.x)
                {
                    amount++;
                    MoveTo(CB, R, P, DOWN,N);
                    amount--;
                }
                else
                {
                    amount++;
                    MoveTo(CB, R, P, UP,N);
                    amount--;
                }
            }
        }
        else if (a == LEFT)
        {
            while (CB[R.x][R.y - 1] != 1 && CB[R.x][R.y - 1] != 2 && R.y != P.y && R.y != 0)
                R.y--;
            if (CB[R.x][R.y - 1] == 1)
            {
                amount++;
                MoveTo(CB, R, P, UP, N);
                MoveTo(CB, R, P, DOWN, N);
                MoveTo(CB, R, P, RIGHT, N);
                amount--;
            }
            else if (CB[R.x][R.y - 1] == 2)
            {
                R.y--;
                amount++;
                MoveTo(CB, R, P, UP, N);
                MoveTo(CB, R, P, DOWN, N);
                MoveTo(CB, R, P, LEFT, N);
                MoveTo(CB, R, P, RIGHT, N);
                amount--;
            }
            else if (R.y == 0)
            {
                amount++;
                MoveTo(CB, R, P, UP, N);
                MoveTo(CB, R, P, DOWN, N);
                MoveTo(CB, R, P, RIGHT, N);
                amount--;
            }
            else if (R.y == P.y)
            {
                if (R.x < P.x)
                {
                    amount++;
                    MoveTo(CB, R, P, DOWN, N);
                    amount--;
                }
                else
                {
                    amount++;
                    MoveTo(CB, R, P, UP, N);
                    amount--;
                }
            }
        }
    }
}

int main()
{
    setlocale(LC_ALL, "Russian");
    int N;
    cout << "Введите размерность доски N" << endl;
    cin >> N;
    int** CB = new int* [N];
    for (int i = 0; i < N; i++)
        CB[i] = new int[N];
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            CB[i][j] = 0;
    int x, y;
    cout << "Введите, сколько фигур будет на доске:" << endl;
    int k;
    cin >> k;
    cout << "Введите, сколько будет белых фигур на доске:" << endl;
    int am;
    cin >> am;
    cout << "Введите координаты белых фигур:" << endl;
    for (int i = 1; i <= am; i++)
    {
        cin >> x >> y;
        CB[x][y] = 1;
    }
    cout << "Введите координаты черных фигур:" << endl;
    for (int i = 1; i <= k - am; i++)
    {
        cin >> x >> y;
        CB[x][y] = 2;
    }
    Point R, P;
    cout << "Введите координаты ладьи:" << endl;
    cin >> R.x >> R.y;

    cout << "Введите координаты нужной точки:" << endl;
    cin >> P.x >> P.y;
    if (R.x == P.x && R.y == P.y) minimum = 0;
    else if (R.x == P.x && R.y == P.y) minimum = 1;
    else minimum = 2;
    Point R_copy;
    R_copy.x = R.x;
    R_copy.y = R.y;
    if (minimum)
    {
        MoveTo(CB, R_copy, P, UP, N);
        MoveTo(CB, R_copy, P, DOWN, N);
        MoveTo(CB, R_copy, P, LEFT, N);
        MoveTo(CB, R_copy, P, RIGHT, N);
        cout << min << " - минимальное число шагов, за которое ладья добирается до точки." << endl;
    }
    else cout << "Ладья уже в этой точке!" << endl;
    for (int i = 0; i < N; i++)
        delete[]CB[i];
    delete[]CB;
    system("pause");
    return 0;
}

Ответы (0 шт):