思路:

靠评测机抖一抖的思路:

拿个队列维护一下符合类型的可以搜索(指四周还存在可以遍历的点)的点。然后暴力搜索,所以问题来了,这个暴力搜索会大大地重复遍历次数。

DFS遍历图以前一直忽略重复,以为搜到打个标记复杂度就很棒棒了,其实还是有一堆重复。

这个思路的代码见第一份。

正解:

那么问题就很明显了,为了减少遍历次数,所以我们BFS,每次仅遍历附近四个,然后拿优先队列维护天数小的,类型小的,这样复杂度仅仅是多了个log,减少了很多重复遍历次数。

第一份代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#include <queue>
using namespace std;
#define LL long long
const int INF = 0x3f3f3f3f;
const int N = 250010; struct asd{
int tp;
int day;
int x,y;
}q[N];
int num;
bool cmp(asd a,asd b){
return a.tp<b.tp;
} int cnt[N];
int n,m;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int ma[550][550];
int type[550][550];
queue<asd>que; bool Judge(int x,int y)
{
if(x<0||y<0||x>=n||y>=m) return false;
return true;
} bool Check(int x,int y)
{
for(int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(Judge(xx,yy)){
if(type[xx][yy]==-1) return true;
}
}
return false;
} void init()
{
num=0;
while(!que.empty()) que.pop();
memset(type,-1,sizeof(type));
memset(cnt,0,sizeof(cnt));
} void DFS(asd now){
asd nex;
bool flag=false;
for(int i=0;i<4;i++){
int xx=now.x+dx[i];
int yy=now.y+dy[i];
if(!Judge(xx,yy)) continue;
if(type[xx][yy]!=-1) continue;
if(abs(ma[xx][yy])>now.day)
{
if(!flag){
nex=now;
nex.day=now.day+1;
que.push(nex);
flag=true;
}
continue;
}
type[xx][yy]=now.tp;
nex.day=now.day;
nex.x=xx;nex.y=yy;
nex.tp=now.tp;
DFS(nex);
}
} int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&ma[i][j]);
if(ma[i][j]>0){
type[i][j]=ma[i][j];
q[num].day=1;
q[num].tp=ma[i][j];
q[num].x=i;
q[num].y=j;
num++;
}
}
}
sort(q,q+num,cmp);
for(int i=0;i<num;i++)
{
if(Check(q[i].x,q[i].y))
que.push(q[i]);
} asd now;
while(!que.empty())
{
now=que.front();que.pop();
DFS(now);
} for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cnt[type[i][j]]++; int qq,x;
scanf("%d",&qq);
while(qq--){
scanf("%d",&x);
printf("%d\n",cnt[x]);
}
}
return 0;
}

第二份正解:百度一堆都是一样的吧。

ZOJ 2849【瞎暴力的搜索】的更多相关文章

  1. 汕头市队赛 SRM14 T1 计算几何瞎暴力

    计算几何瞎暴力 (easy.pas/c/cpp) 128MB 1s 在平面上,给定起点和终点,有一面墙(看作线段)不能穿过,问从起点走到终点的最短路程. 输入格式 输入一行,包含8个用空格分隔的整数x ...

  2. loj517 计算几何瞎暴力

    在序列上维护4个操作 1.在序列的尾端添加x 2.输出Al~Ar的和 3.将所有数异或x 4.将序列从小到大排序 第一眼看上去是Splay于是头铁硬刚了一发 后来发现splay没法异或 去百度“维护异 ...

  3. 玲珑杯”ACM比赛 Round #18 A -- 计算几何你瞎暴力(瞎暴力)

    题目链接:http://www.ifrog.cc/acm/problem/1143?contest=1020&no=0 题解:就是瞎暴力具体多暴力看一下代码就知道了. #include < ...

  4. LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力

    二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 /* LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 叫做计算几 ...

  5. zoj 3644(dp + 记忆化搜索)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...

  6. 玲珑杯 round18 A 计算几何瞎暴力

    题目链接 : http://www.ifrog.cc/acm/problem/1143 当时没看到坐标的数据范围= =看到讨论才意识到,不同的坐标最多只有1k多个,完全可以暴力做法,不过也要一些技巧. ...

  7. hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)

    题目1 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, …, n.树中有n - 1条边,任意两个节点间恰好有一条路 ...

  8. ZOJ Seven-Segment Display 暴力dfs + 剪枝

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3954 0 = on     1 = off A seven segment ...

  9. 玲珑杯 Round #18 A -- 计算几何你瞎暴力

    因为坐标都在1-10之间,因此可暴力求解 #include <iostream> #include <cstdio> #include <cstring> #inc ...

随机推荐

  1. C#统计目录中文件MD5值

    1. [代码]统计目录中文件MD5值 using System.IO;using System.Security.Cryptography;using System.Collections;using ...

  2. php设计模式课程---7、装饰器模式如何使用

    php设计模式课程---7.装饰器模式如何使用 一.总结 一句话总结: 装饰器的核心是获取了文章类整个类,而不是获取了文章内容,有了这个文章类,我想给你加多少装饰就给你加多少装饰(将文章这个类封装进去 ...

  3. window操作常识

  4. appium-DesiredCapability详解与实战

    DesiredCapability对启动app至关重要,是启动app前的准备工作.如果配置错误,app不会成功启动. DesiredCapability有appium公共健值对.Android专有和I ...

  5. linux命令学习笔记(40):wc命令

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. .命令格式: wc [选项]文件... .命令功能: 统计指定文件中的字节数.字数 ...

  6. PS 滤镜——(扭曲)球面化 Spherize

    %%%% Spherize clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorit ...

  7. luogu2627 修剪草坪

    dp[i]表示1~i最大效率 记一下前缀和 转移就是f[i]=max(f[i],f[j-1]-sum[j])+sum[i] (i-k<=j<=i) 发现括号里的只与j有关 开一个单调队列维 ...

  8. ES+open-falcon之报警自动发送请求信息

    当我们监控nginx的状态码出现错误状态码的时候, 一般的处理方法是通过kibana查询是哪个接口导致从而确定是哪个服务,再进一步登录业务机器查询业务日志确定原因. 我们现在要做的事情就是将 人为的通 ...

  9. [BZOJ2962][清华集训]序列操作

    bzoj luogu 题意 有一个长度为\(n\) 的序列,有三个操作: \(I \ \ a\ b\ c\ :\)表示将\([a,b]\)这一段区间的元素集体增加\(c\): \(R \ \ a\ b ...

  10. JAVA 1.5 并发之 ReentrantLock

    在文章里我不打算具体讲Lock的实现,对此有兴趣的请点击这篇博文 http://www.blogjava.net/BucketLi/archive/2010/09/30/333471.html 我是一 ...