zoukankan      html  css  js  c++  java
  • bzoj1102 [POI2007]山峰和山谷Grz

    Description

    FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷。为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量。 给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的。 若两个格子有公共顶点,那么他们就是相邻的格子。(所以与(i,j)相邻的格子有(i−1, j−1),(i−1,j),(i−1,j+1),(i,j−1),(i,j+1),(i+1,j−1),(i+1,j),(i+1,j+1))。 我们定义一个格子的集合S为山峰(山谷)当且仅当: 1.S的所有格子都有相同的高度。 2.S的所有格子都联通 3.对于s属于S,与s相邻的s’不属于S。都有ws>ws’(山峰),或者ws<ws’(山谷)。 你的任务是,对于给定的地图,求出山峰和山谷的数量,如果所有格子都有相同的高度,那么整个地图即是山峰,又是山谷。="" <="" div="" style="font-family: arial, verdana, helvetica, sans-serif;">

    Input

    第一行包含一个正整数n,表示地图的大小(1<=n<=1000)。接下来一个n*n的矩阵,表示地图上每个格子的高度。(0<=w<=1000000000)

    Output

    应包含两个数,分别表示山峰和山谷的数量。

    Sample Input

    输入样例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
    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

    Sample Output

    输出样例1
    2 1

    输出样例2
    3 3

    HINT

    笑而不语……原来bzoj上也有这种水题

    直接上爆搜不解释

    #include<cstdio>
    #define N 1010
    const int mx[8]={1,1,1,0,0,-1,-1,-1};
    const int my[8]={1,0,-1,1,-1,1,0,-1};
    bool vis[N][N];
    int a[N][N];
    int n,s1,s2,t,w,nx,ny,wx,wy;
    int qx[N*N],qy[N*N];
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    inline void bfs(int sx,int sy)
    {
    	t=0;w=1;qx[1]=sx;qy[1]=sy;
    	vis[sx][sy]=1;
    	bool mrk1=1,mrk2=1;
    	for (int j=0;j<8;j++)
    	if (sx+mx[j]>=1&&sx+mx[j]<=n&&sy+my[j]>=1&&sy+my[j]<=n)
    	{
    		int t=a[sx+mx[j]][sy+my[j]];
    		if (t<a[sx][sy])mrk1=0;
    		if (t>a[sx][sy])mrk2=0;
    	}
    	while(t<w)
    	{
    		nx=qx[++t];
    		ny=qy[t];
    		for (int k=0;k<8;k++)
    		{
    			wx=nx+mx[k];
    			wy=ny+my[k];
    			if (wx<1||wx>n||wy<1||wy>n||a[wx][wy]!=a[sx][sy]||vis[wx][wy])continue;
    			if (!vis[wx][wy])
    			{
    				qx[++w]=wx;
    				qy[w]=wy;
    				vis[wx][wy]=1;
    				for (int j=0;j<8;j++)
    				if (wx+mx[j]>=1&&wx+mx[j]<=n&&wy+my[j]>=1&&wy+my[j]<=n)
    				{
    					int t=a[wx+mx[j]][wy+my[j]];
    					if (t<a[sx][sy])mrk1=0;
    					if (t>a[sx][sy])mrk2=0;
    				}
    			}
    		}
    	}
    	if (mrk1)s1++;
    	if (mrk2)s2++;
    }
    int main()
    {
    	n=read();
    	for (int i=1;i<=n;i++)
    	  for (int j=1;j<=n;j++)
    	    a[i][j]=read();
    	for (int i=1;i<=n;i++)
    	  for (int j=1;j<=n;j++)
    	    if(!vis[i][j])bfs(i,j);
    	printf("%d %d
    ",s2,s1);
    }
    

      

    ——by zhber,转载请注明来源
  • 相关阅读:
    ROS系统MoveIt玩转双臂机器人系列(六)--D-H逆运动学求解程序(C++)
    ROS系统MoveIt玩转双臂机器人系列(五)--浅议机器人运动学与D-H建模
    ROS系统MoveIt玩转双臂机器人系列(四)--用户接口的使用
    ROS系统MoveIt玩转双臂机器人系列(三)--利用controller控制实际机器人
    ROS系统MoveIt玩转双臂机器人系列(二)--生成MoveIt配置包
    总纲篇:产品结构设计指导VII(本博客指引章节)
    高阶篇:1)概念设计-总章
    进阶篇:3.3)DFM-铸造件设计总章
    进阶篇:3.4.3)DFM钻削件设计指南
    进阶篇:3.4.4)DFM铣削件设计指南
  • 原文地址:https://www.cnblogs.com/zhber/p/4035925.html
Copyright © 2011-2022 走看看