列表

详情


NC50270. 山峰和山谷

描述

给定一个的网格状地图,每个方格(i,j)有一个高度。如果两个方格有公共顶点,则它们是相邻的。
定义山峰和山谷如下:
  • 均由地图上的一个连通块组成;
  • 所有方格高度都相同;
  • 周围的方格(即不属于山峰或山谷但与山峰或山谷相邻的格子)高度均大于山谷的高度,或小于山峰的高度。
求地图内山峰和山谷的数量。特别地,如果整个地图方格的高度均相同,则整个地图既是一个山谷,也是一个山峰。

输入描述

第一行一个整数n(),表示地图的大小。
接下来n行每行n个整数表示地图。第i行有n个整数,表示地图第i行格子的高度。

输出描述

输出一行两个整数,分别表示山峰和山谷的数量。

示例1

输入:

5
8 8 8 7 7
7 7 8 8 7
7 7 7 7 7
7 8 8 7 8
7 8 8 8 8

输出:

2 1

示例2

输入:

5
5 7 8 3 1
5 5 7 6 6
6 6 6 2 8
5 7 2 5 8
7 1 0 1 7

输出:

3 3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 538ms, 内存消耗: 16224K, 提交时间: 2023-04-30 18:41:52

#include<bits/stdc++.h>
#define int long long
using namespace std;
int visit[1010][1010];
int maps[1010][1010];
int dx[]={0,0,1,-1,-1,1,1,-1};
int dy[]={1,-1,0,0,1,-1,1,-1};
int p,v;
int n;
int res1=0,res2=0;
typedef pair<int,int>pi;
void bfs(int x,int y)
{
	queue<pi>que;
	que.push({x,y});
	visit[x][y]=1;
    while(!que.empty())
    {
    	pi top=que.front();
    	que.pop();
    	int px=top.first;
    	int py=top.second;
    	for(int i=0;i<8;i++)
    	{
		   int tx=px+dx[i];
		   int ty=py+dy[i];
		   if(tx<0||tx>=n||ty<0||ty>=n)continue;
		   if(maps[x][y]!=maps[tx][ty])
		   {
			  if(maps[x][y]<maps[tx][ty])
			  {
				p=1;
			  }
			  else v=1;
		   }
		   else if(!visit[tx][ty]&&maps[x][y]==maps[tx][ty])
		   {
		   	  que.push({tx,ty});
			  visit[tx][ty]=1;
		   }
		}
	}
}
signed main()
{
   cin>>n;
   for(int i=0;i<n;i++)
   {
   	for(int i1=0;i1<n;i1++)cin>>maps[i][i1];
   }
   for(int i=0;i<n;i++)
   {
   	for(int i1=0;i1<n;i1++)
   	   {
   	   	   if(visit[i][i1]==0)
   	   	    {
   	   	    	p=0;v=0;
   	   	        bfs(i,i1);
   	   	        if(p==v&&p==0) res1=res2=1;
   	   	        else if(p*v==1)continue;
   	   	        res1+=v;
   	   	        res2+=p;
			}
	   }
   }
   cout<<res1<<" "<<res2<<endl;
}

C++ 解法, 执行用时: 361ms, 内存消耗: 5292K, 提交时间: 2022-07-04 12:05:59

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
}s,t;
int w[1001][1001],n,ans1,ans2;
bool v[1001][1001];
queue <node> q;
void bfs(const int &x,const int &y){
	s.x = x;
	s.y = y;
	q.push(s);
	v[x][y] = 1;
	int i,j;
	bool f1 = 0,f2 = 0;
	while (!q.empty()){
		t = q.front();
		q.pop();
		for (i = -1;i <= 1;i++)
			for (j = -1;j <= 1;j++){
				s.x = t.x + i;
				s.y = t.y + j;
				if (s.x < 1 || s.x > n || s.y < 1 || s.y > n)
					continue;
				if (w[s.x][s.y] > w[t.x][t.y])
					f1 = 1;
				else if (w[s.x][s.y] < w[t.x][t.y])
					f2 = 1;
				else if (!v[s.x][s.y]){
					q.push(s);
					v[s.x][s.y] = 1;
				}
			}
	}
	if (!f1 && f2)
		ans1++;
	else if (f1 && !f2)
		ans2++;
	else if (!f1){
		ans1++;
		ans2++;
	}
}
int main(){
	int i,j;
	cin>>n;
	for (i = 1;i <= n;i++)
		for (j = 1;j <= n;j++)
			cin>>w[i][j];
	for (i = 1;i <= n;i++)
		for (j = 1;j <= n;j++)
			if (!v[i][j])bfs(i,j);
	cout<<ans1<<' '<<ans2;
	return 0;
}

上一题