1 条题解

  • 1
    @ 2025-10-9 13:32:41

    方法思路

    问题分析​:十字加号的大小由臂长决定,臂长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
    上传者