GRZ-Ridges and Valleys

遍历整个二维数组,将数字相同的都入队,然后标记已经处理过,接着开始处理,判断每个位置是否都比相邻的不同高的位置高或低,就可以判断这些数是否为山谷或山峰
`#include

include

int que[1000007][3];
int m1[8]={-1,-1,-1,0,0,1,1,1},m2[8]={-1,0,1,-1,1,-1,0,1};

int main(){
int n,high=0,low=0,t=1,a=-1;
scanf("%d",&n);
int lst[n][n],flag[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&lst[i][j]);
flag[i][j]=0;
if(a-1) a=lst[i][j];
else{
if(a!=lst[i][j]){
t=0;
}
}
}
}
if(t) printf("1 1");
else{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){//将所以格子遍历一遍
if(flag[i][j]
0){//还未被处理过
flag[i][j]=1;
que[0][0]=i;
que[0][1]=j;
que[0][2]=lst[i][j];
int head=0,tail=1;
while(head<tail){
for(int k=0;k<8;k++){ //同高的全部入队
int x=que[head][0]+m1[k],y=que[head][1]+m2[k];
if(x>=0&&x<n&&y>=0&&y<n&&
!flag[x][y]&&que[head][2]lst[x][y]){
que[tail][0]=x;
que[tail][1]=y;
que[tail][2]=lst[x][y];
flag[x][y]=1;
tail++;
}
}
head++;
}
int h=0,f=1;
for(int k=0;k<tail;k++){
for(int l=0;l<8;l++){
int x=que[k][0]+m1[l],y=que[k][1]+m2[l];
if(x>=0&&x<n&&y>=0&&y<n&&lst[x][y]!=que[k][2]){
if(h
0){
if(lst[x][y]>que[k][2]) h=-1;
else h=1;
}
else if(h1){
if(lst[x][y]>que[k][2]){
f=0;break;
}
}
else{
if(lst[x][y]<que[k][2]){
f=0;break;
}
}
}
}
if(f
0) break;
}
if(f){
if(h==1) high++;
else low++;
}
}
}
}
printf("%d %d",high,low);
}

return 0;

} `

posted @ 2025-02-13 22:39  十柒*  阅读(2)  评论(0编辑  收藏  举报