第一问都过不了,,,实在是很困扰,,,一下午了,,,
查看原帖
第一问都过不了,,,实在是很困扰,,,一下午了,,,
340222
代码练习生楼主2020/8/3 18:31
#include<stdio.h>

int M,N,ranges[501][2],hash[501],map[501][501],dp[501][501],tianc[501],sort[501],N_line[501],count,cur;

void
dfs(int x,int y){
    if(x==N){
        if(!N_line[y]){
            count++;
            N_line[y]=1;
        }
        ranges[cur][0]=ranges[cur][0]<y?ranges[cur][0]:y;
        ranges[cur][1]=ranges[cur][1]>y?ranges[cur][1]:y;
    }
    dp[x][y]=cur;
    if(x>1 && dp[x-1][y]!=cur && map[x-1][y]<map[x][y])
        dfs(x-1,y);
    if(x<N && dp[x+1][y]!=cur && map[x+1][y]<map[x][y])
        dfs(x+1,y);
    if(y>1 && dp[x][y-1]!=cur && map[x][y-1]<map[x][y])
        dfs(x,y-1);
    if(y<M && dp[x][y+1]!=cur && map[x][y+1]<map[x][y])
        dfs(x,y+1);
}

int
main(){
    int i,j,r=1;
    
    scanf("%d%d",&N,&M);
    i=1;
    while(i<=N){
        j=1;
        while(j<=M){
            scanf("%d ",map[i]+j);
            j++;
        }
        i++;
    }
    for(i=1;i<=M;i++){
        if(map[1][i]<map[1][i-1])
            continue;
        cur=i;
        ranges[i][0]=501;
        dfs(1,i);
    }
    if(count!=M){
        printf("0\n%d",M-count);
        return 0;
    }
    for(i=1;i<=M;i++){
        j=ranges[i][0];
        if(!sort[j] || ranges[i][1]>ranges[sort[j]][1])
            sort[j]=i;
    }
    for(i=1;i<=M;i++){
        if(!sort[i])
            continue;
        if(ranges[sort[i]][1]>r){
            for(j=r;j<=ranges[sort[i]][1];j++)
                tianc[j]=sort[i];
            r=ranges[sort[i]][1];
        }
    }
    
    for(i=1,count=0;i<=M;i++){
        if(!hash[tianc[i]])
            count++,hash[tianc[i]]=1;
    }
    printf("1\n%d",count);
    return 0;
}
2020/8/3 18:31
加载中...