-
Автор темы
- #1
есть карта по горизонтали от A до M и по вертикали от 1 до 13, каждый квадрат пусть будет 300 метров, через чатгпт начирикал код снизу, но загвоздка в том, что в каждом таком квадрате есть более мелкие квадраты(в данном случае каждый по 100 метров).
мне нужно например стрелять из точки A1 3 в C3 8 и узнать расстояние между этими двумя точками
вопрос собственно в том, как это реализовать?
мне нужно например стрелять из точки A1 3 в C3 8 и узнать расстояние между этими двумя точками
вопрос собственно в том, как это реализовать?
Готовое решение:
#include <iostream>
#include <cmath>
#include <string>
#include <locale>
// Структура для хранения координат
struct Coordinate {
char column;
int row;
int subSquare;
};
// Функция для вычисления расстояния между двумя квадратами
double calculateDistance(const Coordinate& coord1, const Coordinate& coord2, int largeSquareSize) {
// Конвертация координат из формата квадратов в метры
int coord1X = (coord1.column - 'A') * largeSquareSize + ((coord1.subSquare - 1) % 3) * (largeSquareSize / 3);
int coord1Y = (coord1.row - 1) * largeSquareSize + ((coord1.subSquare - 1) / 3) * (largeSquareSize / 3);
int coord2X = (coord2.column - 'A') * largeSquareSize + ((coord2.subSquare - 1) % 3) * (largeSquareSize / 3);
int coord2Y = (coord2.row - 1) * largeSquareSize + ((coord2.subSquare - 1) / 3) * (largeSquareSize / 3);
// Вычисление расстояния
int deltaX = coord2X - coord1X;
int deltaY = coord2Y - coord1Y;
return std::sqrt(deltaX * deltaX + deltaY * deltaY);
}
// Функция для преобразования буквенно-цифровых координат в числовые координаты
Coordinate parseCoordinate(const std::string& coordinateString) {
Coordinate result;
result.column = coordinateString[0];
size_t spacePos = coordinateString.find(' ');
result.row = std::atoi(coordinateString.substr(1, spacePos - 1).c_str());
result.subSquare = std::atoi(coordinateString.substr(spacePos + 1).c_str());
return result;
}
int main() {
setlocale(LC_ALL, "Russian");
int mapSizeChoice = 0;
int largeSquareSize = 0;
bool mapSizeChosen = false;
while (true) {
// Проверка, был ли уже выбран размер карты
if (!mapSizeChosen) {
// Ввод выбора размера карты, если он ещё не был выбран
std::cout << "Выберите размер карты:\n";
std::cout << "1. 1 км (квадрат 75 метров)\n";
std::cout << "2. 2 км (квадрат 150 метров)\n";
std::cout << "3. 4 км (квадрат 300 метров)\n";
std::cin >> mapSizeChoice;
switch (mapSizeChoice) {
case 1:
largeSquareSize = 75;
break;
case 2:
largeSquareSize = 150;
break;
case 3:
largeSquareSize = 300;
break;
default:
std::cerr << "Неверный выбор. Используется размер карты по умолчанию: 2 км\n";
largeSquareSize = 150;
break;
}
// Установка флага, что размер карты был выбран
mapSizeChosen = true;
// Очистка входного потока
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
// Ввод координат точек
std::string coord1Str, coord2Str;
std::cout << "Введите координаты первой точки (например, A1 4): ";
std::getline(std::cin, coord1Str);
std::cout << "Введите координаты второй точки (например, C7 8): ";
std::getline(std::cin, coord2Str);
Coordinate coord1 = parseCoordinate(coord1Str);
Coordinate coord2 = parseCoordinate(coord2Str);
double distance = calculateDistance(coord1, coord2, largeSquareSize);
std::cout << "Расстояние между точками: " << distance << " метров" << std::endl;
char choice;
std::cout << "Желаете продолжить? (Y/N): ";
std::cin >> choice;
if (choice != 'Y' && choice != 'y') {
break; // Выход из программы
}
// Очистка входного потока
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
return 0;
}
Последнее редактирование: