山峰和山谷(bfs)

山峰和山谷

解题思路

一道bfs
每次从一个没有访问过的点开始
周围有点相等
继续访问
否则就判断它周围的点与这个区间点的大小

AC代码

#include<cstdio>
using namespace std;
int n,answer1,answer2,px[1000005],py[1000005],c[1005][1005],w[1005][1005];
int dx[8]={
   0,0,1,-1,1,-1,1,-1};
int dy[8]={
   1,-1,0,0,-1,-1,1,1};
bool check(int x,int y)//判断是否出界
{
   
	if(x>=1&x<=n&&y>=1&&y<=n)return true;
	return false;
}
void bfs(int x,int y)
{
   
	int ok1=0,ok2=0,head=0,tail=0,num=w[x][y];//初值
	px[++tail]=x;
	py[tail]=y;
	c[x][y]=1;
	while(head<tail)//bfs
	{
   
		head++;
		for(int i=0;i<8;i++)
		{
   
			int xx=dx[i]+px[head],yy=dy[i]+py[head];
			if(check(xx,yy))
			{
   
				if(w[xx][yy]==num)
				{
   
					if(c[xx][yy]==0)c[xx][yy]=1,px[++tail]=xx,py[tail]=yy;
				}
				else 
				{
   
				 	if(w[xx][yy]<num)ok1=1;
				 	if(w[xx][yy]>num)ok2=1;
				}
			}
		}
	}
	if(ok1==0&&ok2==0)answer1++,answer2++;//判断
	if(ok1==1&&ok2==0)answer1++;
	if(ok1==0&&ok2==1)answer2++;
	return;
}
int main()
{
   
	scanf("%d",&n);//输入
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	  scanf("%d",&w[i][j]);
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	  if(c[i][j]==0)bfs(i,j);
	printf("%d %d",answer1,answer2);  
	return 0;
}
 

谢谢

全部评论

相关推荐

07-07 11:33
江南大学 Java
已经在暑假实习了&nbsp;,没有明确说有hc,纠结实习到八月份会不会有点影响秋招毕竟感觉今年好多提前批
程序员小白条:92的话准备提前批,其他没必要,没面试机会的,而且你要准备充分,尤其八股和算法题
点赞 评论 收藏
分享
05-23 20:31
已编辑
武汉大学 Java
内向的柠檬精在研究求...:注意把武大标粗标大 本地你俩不是乱杀
实习进度记录
点赞 评论 收藏
分享
05-30 12:03
山西大学 C++
offer来了我跪着...:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务