酷代码 AI
菜单
服务商

小核桃侦探仓库部署问题的C++解决方案

以下是解决该问题的C++代码: ```cpp #include <iostream> #include <vector> #include <climits> using namespace std; // 计算距离总和 int calculateDistance(int x, int y, int m, int centerX, int centerY) { int distance = 0; for (int i = y; i < y + m; i++) { distance += abs(x - centerX) + abs(i - centerY); } return distance; } // 寻找合适的位置 vector<int> findPosition(vector<vector<bool>>& warehouse, int m, int centerX, int centerY) { int minDistance = INT_MAX; int bestX = -1, bestY = -1; int K = warehouse.size(); for (int i = 0; i < K; i++) { for (int j = 0; j <= K - m; j++) { bool canPlace = true; for (int k = 0; k < m; k++) { if (warehouse[i][j + k]) { canPlace = false; break; } } if (canPlace) { int distance = calculateDistance(i, j, m, centerX, centerY); if (distance < minDistance) { minDistance = distance; bestX = i; bestY = j; } else if (distance == minDistance) { if (i < bestX) { bestX = i; bestY = j; } else if (i == bestX && j < bestY) { bestY = j; } } } } } return {bestX, bestY}; } int main() { int N, K; cin >> N >> K; vector<int> M(N); for (int i = 0; i < N; i++) { cin >> M[i]; } vector<vector<bool>> warehouse(K, vector<bool>(K, false)); int centerX = (K + 1) / 2 - 1; int centerY = (K + 1) / 2 - 1; for (int i = 0; i < N; i++) { vector<int> position = findPosition(warehouse, M[i], centerX, centerY); int x = position[0]; int y = position[1]; if (x == -1) { cout << -1 << endl; } else { for (int j = y; j < y + M[i]; j++) { warehouse[x][j] = true; } cout << x + 1 << " " << y + 1 << " " << y + M[i] << endl; } } return 0; } ``` ### 代码解释: 1. **`calculateDistance` 函数**:该函数用于计算一个小队部署在某一行的某一区间时,所有成员到大盗中心位置的距离总和。 2. **`findPosition` 函数**:该函数用于寻找合适的位置。它遍历仓库的每一行和每一个可能的起始位置,检查是否有连续的空位。如果有,计算距离总和,并更新最小距离和最佳位置。 3. **`main` 函数**:读取输入,初始化仓库,然后依次处理每支小队。对于每支小队,调用 `findPosition` 函数寻找合适的位置。如果找到位置,更新仓库状态并输出结果;否则,输出 -1。 ######[AI问答 | 857点数解答 | 2026-03-29 15:46:32]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]