Ладья - бэктрекинг, не могу найти утечку памяти (и нормальный код)
Сама задача: Найти кратчайший по количеству ходов путь ладьи позволяющий попасть из одной клетки в другую. Известно расположение белых и черных фигур на доске. Фигуры противоположного цвета можно бить. При запуске программа выдает утечку после инициализации всех элементов. Ненавижу задачи на шахматы, поэтому код был реализован вот так:
//Функция
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;
}