昨天校内比赛做了一个很有意思的题,体面如图:

题目大概意思是,给出一个俯视图矩阵,矩阵内元素表示当前位置有多少个方块,最后要求输出该立体图形中面的数量。

首先给出一组数据:

3 4
2 1 2 1
1 2 3 2
2 1 2 1
这组数据的正解是34,如果需要更多组测试, 把这个图形掉个头,就好。如图:

具体思路是,分不同的面进行统计:首先使用深搜找到所有联通的顶层快,得出面的数量,之后对于每个面(前,后,左,右)进行遍历,得出“多出来的面”的数量。其中有且仅有“沿着遍历方向,后一个高于前一个,更高的面与上一行的面不连通”可以使得面的数量增加。

show the code

#include<iostream>
#include<stdio.h>
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std; const long long MAXN=; long long mapp[MAXN][MAXN];
long long m,n; long long topp=;
long long addd[MAXN][MAXN][];
long long checkk[MAXN*MAXN]; void dfs(long long x,long long y)
{
if(checkk[x*MAXN+y]==)return;
checkk[x*MAXN+y]=;
long long now=mapp[x][y];
if(mapp[x+][y]==now)dfs(x+,y);
if(mapp[x][y+]==now)dfs(x,y+);
if(x>=&&mapp[x-][y]==now)dfs(x-,y);
if(y>=&&mapp[x][y-]==now)dfs(x,y-);
}
long long calTop()
{
for(long long i=;i<n;++i)
{
for(long long j=;j<m;++j)
{
if(checkk[i*MAXN+j]!=)topp++,dfs(i,j);
}
}
// cout<<topp<<endl;
} void init()
{
cin>>n>>m;
for(long long i=;i<n;++i)
{
for(long long j=;j<m;++j)
{
cin>>mapp[i][j];
}
}
} long long right()
{
long long res=;
for(long long i=;i<n;++i)
{
for(long long j=;j<m;++j)
{
if(mapp[i][j]>mapp[i][j-])
{
res++;
addd[i][j][]++;
if(i>&&addd[i-][j][]==&&mapp[i-][j-]<mapp[i][j]&&mapp[i-][j]>mapp[i][j-])
{
res--;
} }
}
}
return res;
}
long long left()
{
long long res=;
for(long long i=;i<n;++i)
{
for(long long j=m-;j>=;--j)
{
if(mapp[i][j]>mapp[i][j+])
{
res++;
addd[i][j][]++;
if(i>&&addd[i-][j][]==&&mapp[i-][j+]<mapp[i][j]&&mapp[i-][j]>mapp[i][j+])
{
res--;
} }
}
} return res;
} long long top()
{
long long res=;
for(long long j=;j<m;++j)
{
for(long long i=;i<n;++i)
{
if(mapp[i][j]>mapp[i-][j])
{
res++;
addd[i][j][]++;
if(j>&&addd[i][j-][]==&&mapp[i-][j-]<mapp[i][j]&&mapp[i][j-]>mapp[i-][j])
{
res--;
} } }
}
return res;
} long long bottom()
{
long long res=;
for(long long j=;j<m;++j)
{
for(long long i=n-;i>=;--i)
{
if(mapp[i][j]>mapp[i+][j])
{
res++;
addd[i][j][]++;
if(j>&&addd[i][j-][]==&&mapp[i+][j-]<mapp[i][j]&&mapp[i][j-]>mapp[i+][j])
{
res--;
}
}
}
}
return res;
}
int main()
{
memset(mapp,-,sizeof(mapp));
memset(addd,,sizeof(addd));
memset(checkk,,sizeof(checkk)); cin.sync_with_stdio(false); init();
calTop(); topp+=;
topp+=right();
topp+=left();
topp+=top();
topp+=bottom();
cout<<topp<<endl;
return ;
}

最后。学校老服务器性能不行,加一行cin.sync_with_stdio(false);分分钟AC。

HOJ 13819 Height map的更多相关文章

  1. 如何由Height Map生成Normal Map

    转自:http://www.cnblogs.com/cxrs/archive/2009/11/01/1594155.html Nvidia和ATI都有相应的工具把Heightmap转成NormalMa ...

  2. shader复杂与深入:Normal Map(法线贴图)1

    转自:http://www.zwqxin.com/archives/shaderglsl/review-normal-map-bump-map.htmlNormal Map法线贴图,想必每个学习计算机 ...

  3. ROS_Kinetic_x ROS栅格地图庫 Grid Map Library

    源自:https://github.com/ethz-asl/grid_map Grid Map Overview This is a C++ library with ROS interface t ...

  4. [SharpMap] 屏幕坐标和Map坐标转换

    1. SharpMap中屏幕坐标和地图Map坐标转换: using System.Drawing; using GeoAPI.Geometries; namespace SharpMap.Utilit ...

  5. echarts3结合openlayers2实现Map类型图表

    网上查阅了部分资料,有些是用echarts2实现的,因echarts2无法满足项目中其他部分的要求,故只能采用echarts3(2017/9/18,echarts3官网突然把基于geo的demo下架了 ...

  6. (转)简述47种Shader Map的渲染原理与制作方法

    在Shader中会使用各种不同图参与渲染,所以简单地总结下各种图的渲染原理.制作方法,最后面几种是程序生成图. 1. Albedo 2. Diffuse(Photographic) 从上图可以看出来, ...

  7. [LeetCode] Trapping Rain Water II 收集雨水之二

    Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...

  8. Android二维码的生成,解析以及扫描功能

    <1> 布局只有2个按钮,实现生成二维码和解析二维码 <Button android:layout_width="wrap_content" android:la ...

  9. QT_地图导航

    //地图显示功能 #ifndef MAPWIDGET_H #define MAPWIDGET_H #include <QGraphicsView> #include <QLabel& ...

随机推荐

  1. Kotlin lateinit 和 by lazy 的区别

    1.lazy{} 只能用在val类型, lateinit 只能用在var类型 2.lateinit不能用在可空的属性上和java的基本类型上 3.lateinit可以在任何位置初始化并且可以初始化多次 ...

  2. jQuery判断动画是否执行完成

    JS $(function() { $("#myDiv").bind("click", function() { if ($(this).css("t ...

  3. WebApi 实例

    REST是设计风格而不是标准. webapi有自己的路由. webservice和wcf的协议都是soap协议,数据的序列化和反序列化都是soap的格式.而webapi是Json的数据传递 webap ...

  4. springboot 学习笔记(八)

    springboot整合activemq,实现queue,topic同时支持 1.JMS中定义了两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subs ...

  5. 常用模块random,time,os,sys,序列化模块

    一丶random模块 取随机数的模块 #导入random模块 import random #取随机小数: r = random.random() #取大于零且小于一之间的小数 print(r) #0. ...

  6. 零基础逆向工程31_Win32_05_提取图标_修改标题

    在程序中使用图标 1.加载图标 HICON hIcon; hIcon = LoadIcon (hAppInstance, MAKEINTRESOURCE (IDI_ICON)); hAppInstan ...

  7. AngularJs Type error : Cannot read property 'childNodes' of undefined

    参考博客: https://blog.csdn.net/u011127019/article/details/73087868 在AngularJs和JQuery插件共存咋项目中经常会遇到如下异常 T ...

  8. 【extjs6学习笔记】1.11 初始: config

    Ext JS有一个名为config的功能. 该配置允许您使用默认值声明公共属性,这些属性将被其他类成员完全封装. 通过config声明的属性将自动获取get()和set()方法,如果类没有定义这些方法 ...

  9. Hyper-V 2016 配置管理系列(准备篇)

    2.1 推荐软硬件配置 2.2 Hyper主机前提准备 前提条件: 具有二级地址转换(SLAT)的64位处理器.要安装Hyper-V虚拟化组件(如Windows管理程序),处理器必须具有SLAT 足够 ...

  10. linux下获取外网IP

    使用阿里云或者有多个网卡IP的机器需要取外网IP时,可以用下面这种 wget -qO - ifconfig.co 更多方法参考:https://yq.aliyun.com/ziliao/105999