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

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

首先给出一组数据:

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. bootstrap Table的 一些小操作

    function HQCreatTable(ob) { var option = { cache: false,//是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*) scroll ...

  2. 初始socket

    一.客户端/服务器架构 1.C/S结构,即Client/Server(客户端/服务器)结构 2.我们在互联网中处处可见c/s架构比如说浏览器,qq,lol,视频软件... 3.我们学习socket就是 ...

  3. 记秋招第一个offer:去哪儿

    9月17日 网申去哪儿,没有内推,因为网申了就不能内推了.难受,内推可以免简历筛选的,这下好了,可能简历直接挂了.我怎么犯了这么低级的错误?还没去搞清楚能不能内推就先傻乎乎地网申了. 9月28日 晚上 ...

  4. JavaScript获取URL参数公共方法

    写一个JavaScript获取URL参数的通用方法,可以把它放到常用方法的JS文件中调用,直接上代码例子,新手可以学习一下! <!DOCTYPE html> <html lang=& ...

  5. Android自定义控件练手——简单的时钟

    首先这应该是一个老生常谈的设计了,但是毕竟身为小白的自己都没动手做过,不动手怎么提高自己呢,所以在这梅林沉船闲暇之际,我就把我的设计流程与思路记录下来.首先来看看效果图吧: 如上图就是一个简单并没有美 ...

  6. iOS中UIWebview中网页宽度自适应的问题

    有的网页中会使用"<meta name="viewport" content="width=device-width, initial-scale=1.0 ...

  7. badboy页面脚本发生错误,解决方案

    1.参考网址:https://jingyan.baidu.com/article/e9fb46e17537797520f76645.html?from=qqbrowser061108 本人亲自测试,方 ...

  8. windows mysql忘记密码解决方案

    因为mysql很久之前装的,今天突然想用的时候发现密码不记得,怎一个尴尬了得,所以没办法,只能修改一个新的密码.       在此过程中遇到了几个问题      1.没法进入数据库:      2.修 ...

  9. StackOverflow之旅<2>------{HashMap和Hashtable的区别}

    问题 在Java中HashMap和Hashtable的区别? 哪一个对于多线程应用程序更好? 回答 Hashtable是同步的,加了synchronized锁,而HashMap不是.没有加synchr ...

  10. Linux命令技巧:如何在Linux下重命名多个文件

    我知道我可以用mv命令重命名文件.但是当我想重命名很多文件怎么办?如果为每个文件都这么做将会是很乏味的.有没有办法一次性重命名多个文件? 在Linux中,当你想要改变一个文件名,使用mv命令就好了.然 ...