1 条题解

  • 0
    @ 2026-9-30 12:45:10

    C++ :

    
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int n,m;
    static int a[1005][1005];
    int main(){
        if(scanf("%d %d",&n,&m)!=2) return 0;
        for(int i=0;i<n;i++)for(int j=0;j<m;j++)scanf("%d",&a[i][j]);
        int ans=0;
        // 方向:右(0,1) 下(1,0) 右下(1,1) 左下(1,-1);每对相邻羊连边,求最长链
        int dr[4]={0,1,1,1}, dc[4]={1,0,1,-1};
        static int f[1005][1005][4];
        // 因为边方向单调(行递增),可按行从后往前递推,每条直线最长连续段
        int best=0;
        for(int i=n-1;i>=0;i--)for(int j=0;j<m;j++){
            if(!a[i][j]) continue;
            for(int d=0;d<4;d++){
                int pi=i-dr[d], pj=j-dc[d];
                int v=1;
                if(pi>=0&&pi<n&&pj>=0&&pj<m&&a[pi][pj])
                    v=f[pi][pj][d]+1;
                f[i][j][d]=v;
                if(v>best)best=v;
            }
        }
        ans = best>=2?best:0;
        printf("%d\n",ans);
        return 0;
    }
    
    
    • 1

    信息

    ID
    2701
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者