这题说的是给了一个n*m的网格,然后每个格子的点事黑色的或者是白色的然后每个点如图所示

   然后只能用白点和图中给出的边建立三角形然后询问三角形的个数有多少个,这样说每个三角形的边必须是图中有的边,然后三角形的边上的点必须全部为白色的点然后计算这样能组成多少个三角形,先对每个点处理好他8个方向所能到达最大的长度,这里花了n*m*4的时间然后去判断每个点所能到达的最多多少个三角形时间为400*400*400然后得解

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAX_N = ;
int len[MAX_N][MAX_N][];
char map[MAX_N][MAX_N];
__int64 ans=;
int n,m;
void init(){
for(int i=; i<=n; i++){
for(int j= ; j<=m; ++j )
if(map[i][j]==''){
len[i][j][]=;
len[i][j][]=;
len[i][j][]=;
}else{
len[i][j][]=len[i-][j-][]+;
len[i][j][]=len[i-][j][]+;
len[i][j][]=len[i][j-][]+;
}
for(int j=m; j>; --j)
if(map[i][j]==''){
len[i][j][]=;
len[i][j][]=;
}else{
len[i][j][]=len[i-][j+][]+;
len[i][j][]=len[i][j+][]+;
}
}
for(int i=n; i>; i--){
for(int j = ; j<=m; ++j )
if(map[i][j]=='')
{
len[i][j][]=;
len[i][j][]=;
}else{
len[i][j][]=len[i+][j-][]+;
len[i][j][]=len[i+][j][]+;
}
for(int j=m; j>; --j)
if(map[i][j]==''){
len[i][j][]=;
}else{
len[i][j][]=len[i+][j+][]+;
}
} }
int pC(int a,int b,int c){ if(a>=b&&b>=c) return b;
if(a>=c&&c>=b) return c;
if(b>=a&&a>=c) return a;
if(b>=c&&c>=a) return c;
if(c>=a&&a>=b) return a;
if(c>=b&&b>=a) return b;
}
void solve1(int x,int y,int L){
for(int k= ; k< L; ++k)
{
if(x-k<) break;
if(len[x][y][]>k&&len[x][y][]>k&&len[x-k][y][]>k)
ans++;
if(len[x][y][]>k&&len[x][y][]>k&&len[x-k][y][]>k)
ans++;
if(len[x][y][]>k&&len[x][y][]>k&&len[x-k][y][]>k&&len[x-k][y][]>k)
ans++;
} }
void solve2(int x,int y,int L){
for(int k=; k<L; k++){
if(y+k>m) break;
if(len[x][y][]>k && len[x][y][]>k && len[x][y+k][]>k)
ans++;
if(len[x][y][]>k && len[x][y][]>k && len[x][y+k][]>k && len[x][y+k][]>k)
ans++;
}
}
void solve3(int x,int y,int L){
for(int k =; k<L ;k++){
if(x+k>n) break;
if(len[x][y][]>k && len[x][y][]>k && len[x+k][y][]>k)
ans++;
if(len[x][y][]>k&& len[x][y][]>k && len[x+k][y][]>k && len[x+k][y][]>k )
ans++;
}
}
void solve4(int x,int y,int L){
for(int k=; k<L ; ++k)
{
if(y-k<) break;
if(len[x][y][]>k&&len[x][y][]>k&&len[x][y-k][]>k&&len[x][y-k][]>k)
ans++;
}
}
int main()
{
while(scanf("%d%d",&n,&m)==){
ans=;
for(int i=; i<=n; ++i)
scanf("%s",map[i]+);
memset(len,,sizeof(len));
init();
for(int i=; i<=n; i++ ){
for(int j=; j<=m; ++j){
int L = pC(len[i][j][],len[i][j][],len[i][j][]);
solve1(i,j,L);
L = pC(len[i][j][],len[i][j][],len[i][j][]);
solve2(i,j,L);
L = pC(len[i][j][],len[i][j][],len[i][j][]);
solve3(i,j,L);
L = pC(len[i][j][],len[i][j][],len[i][j][]);
solve4(i,j,L);
}
}
printf("%I64d\n",ans);
} return ;
}

cf249D的更多相关文章

随机推荐

  1. C# IEqualityComparer 去重

    1.去除list里某重复字段值的数据(相当于group by) public class CorrController { //方法 public void DoGet() { List<tes ...

  2. STM8L外部中断 为何 死循环 寄存器操作

    STM8L 系列单片机是 ST公司推出的低功耗单片机,与STM8S系列相比功耗降低了很多,但内部结构也删减了很多,使用时一定要仔细阅读手册.  这是第一次使用STM8,实现功能不是很复杂就没想研究库函 ...

  3. AFNetWork 简单实用demo

    NSString *postUrl = @"http://www.huway.com/api_index?module=event&action=topads"; NSDi ...

  4. Scala日期处理

    计算时间间隔  val d = new java.text.SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new java.util.D ...

  5. 2017年TOP100summit开幕在即, 15位大咖担任联席主席甄选最值得学习的100个研发案例

    从万维网到物联网,从信息传播到人工智能,20年间软件研发行业趋势发生了翻天覆地的变化.大数据.云计算.AI等新兴领域逐渐改变我们的生活方式,Devops.容器.深度学习.敏捷等技术方式和工作理念对软件 ...

  6. easyui-datagrid个人实例

    这个实例数据表格的功能,可以实现分页,增删改查功能 1.user.jsp <%@ page language="java" contentType="text/ht ...

  7. HDFS Snapshots

    Overview HDFS Snapshots are read-only point-in-time copies of the file system. Snapshots can be take ...

  8. LINUX系统中安装ORACLE11g的安装文档,含部分问题解答

    1.无法使用命令 /usr/bin/xdpyinfo 自动检查显示器颜色 在linux as5下安装oracle11g,环境都配置好了!等运行./runInstaller的时候无法弹出安装的图形界面我 ...

  9. garbage collection - 垃圾收集 生命周期 跟踪内存使用

    Professional.JavaScript.for.Web.Developers.3rd.Edition.Jan.2012 JavaScript is a garbage-collected la ...

  10. CDN工作过程(第二种版本)

    作者:代希刚链接:https://www.zhihu.com/question/36514327/answer/121026637来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...