1 条题解
-
1
方法思路
问题分析:十字加号的大小由臂长决定,臂长k表示从中心点向每个方向延伸的连续1的个数(包括中心点)。十字加号的总1数为4*(k-1) + 1。
关键观察:对于每个可能成为中心的1,我们需要计算四个方向上的连续1的个数,取最小值作为臂长k,从而得到该中心点的十字大小。
算法选择:遍历矩阵中的每个元素,如果是1,则计算其四个方向的连续1的个数,确定最小臂长,并计算十字大小,更新最大值。
复杂度分析:由于矩阵的最大尺寸为10x10,算法的时间复杂度为O(nmmin(n,m)),在给定的约束下是高效的。
解决代码
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n, m; cin >> n >> m; vector<vector<int>> matrix(n, vector<int>(m)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> matrix[i][j]; } } int ans = 0; int max_arm = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (matrix[i][j] == 0) continue; int up = 0; for (int k = i; k >= 0; k--) { if (matrix[k][j] == 1) up++; else break; } if (up < max_arm) { continue; } int down = 0; for (int k = i; k < n; k++) { if (matrix[k][j] == 1) down++; else break; } if (down < max_arm) { continue; } int left = 0; for (int k = j; k >= 0; k--) { if (matrix[i][k] == 1) left++; else break; } if (left < max_arm) { continue; } int right = 0; for (int k = j; k < m; k++) { if (matrix[i][k] == 1) right++; else break; } if (right < max_arm) { continue; } int arm = min(min(up, down), min(left, right)); if (arm > max_arm) { max_arm = arm; } int size = 4 * (arm - 1) + 1; if (size > ans) { ans = size; } } } cout << ans << endl; return 0; }
- 1
信息
- ID
- 202
- 时间
- 10ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者