1 solutions

  • 1
    @ 2025-9-12 10:59:26

    复杂,思维简单的bfs

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    struct nod
    {
    	int x,y;
    };
    const int NR=1001,X[]={-1,-1,0,1,1,1,0,-1},Y[]={0,1,1,1,0,-1,-1,-1};
    bool vis[NR][NR];
    int n,h[NR][NR];
    bool w1=1;//山峰
    bool w2=1;//山谷 
    void bfs(int x,int y) 
    {
    	queue<nod> q;
    	q.push({x,y});
    	vis[x][y]=true;
    	while(!q.empty())
    	{
    		int sx=q.front().x,sy=q.front().y,i;
    		q.pop();
    		for(i=0;i<=7;i++)
    		{
    			int tx=sx+X[i],ty=sy+Y[i];
    			if(tx<1 || tx>n || ty<1 || ty>n) continue;
    			if(h[sx][sy]<h[tx][ty]) 
    			{
    				w1=0;//不可能是山峰 
    				continue;
    			}
    			if(h[sx][sy]>h[tx][ty]) 
    			{
    				w2=0;//不可能是山谷 
    				continue;
    			}
    			if(vis[tx][ty]) continue;
    			vis[tx][ty]=true;
    			q.push({tx,ty});
    		}
    	}
    	return;
    }
    int main()
    {
    	cin>>n;
    	int i,j,ans1=0,ans2=0;
    	for(i=1;i<=n;i++)
    		for(j=1;j<=n;j++) cin>>h[i][j];
    	for(i=1;i<=n;i++)
    		for(j=1;j<=n;j++)
    			if(!vis[i][j]) 
    			{
    				bfs(i,j);
    				ans1+=w1;
    				ans2+=w2;
    				w1=1;
    				w2=1;
    			}
    	cout<<ans1<<" "<<ans2;
    	return 0;
    }
    
    • 1

    Information

    ID
    2516
    Time
    1000ms
    Memory
    125MiB
    Difficulty
    4
    Tags
    # Submissions
    1
    Accepted
    1
    Uploaded By