Это то же самое, что и проверка того, пересекаются ли прямоугольники, я думаю, ваш код был бы проще, если бы вы не рассматривали эти корабли как точку, длину и направление, а как прямоугольник.
Так что конвертируйте это
int x // x position of first part of ship
int y // y position of first part of ship
char dir // direction of the ship, either 'N','S','E' or 'W'
int length // length of the ship
в это (разрешите отрицательные cx и cy получить N, S, E, W)
int x // x position of first part of ship
int y // y position of first part of ship
int cx // length of the ship in X
int cy // length of the ship in Y
или это
int left // x position of Eastern part of the ship
int top // y position of Northernmost part of ship
int right // x position of Westernmost part of the ship
int bottom // y position of Southernmost part of ship
bool orientation; // so we can tell East from West or North from South.
Тогда простая функция может определить, пересекаются ли два корабля.
bool DoShipsIntersect(Ship * a, Ship * b)
{
if ((a->right < b->left) || (b->right < a->left))
return false;
if ((a->bottom < b->top) || (b->bottom < a->top))
return false;
return true;
}
Сравнение грубой силы каждого корабля с каждым другим кораблем должно быть достаточно быстрым, если у вас нет тысячкораблей.