题意简述:矩阵中有的点不能走,你每次可从四个方向走,至少走一步,最多走k步(不能横跨那些不能走的格子),问从(sx,sy)走到(tx,ty)的最短时间是多少?

题意:利用set来加速bfs的过程,原理是一个点一旦走过就不需要再去走了,具体看代码

#include <bits/stdc++.h>
using namespace std; const int N = 1002;
bool G[N][N];
int n, m, k, d[N][N];
set<int> xs[N], ys[N]; void clear_rem(vector<pair<int,int> > &rem){
for(auto p : rem){
xs[p.first].erase(p.second);
ys[p.second].erase(p.first);
}
rem.clear();
} void bfs(int sx, int sy){
xs[sx].erase(sy); ys[sy].erase(sx);
queue<pair<int,int> > q; q.push({sx,sy});
d[sx][sy]=0;
while(!q.empty()){
pair<int,int> u=q.front(); q.pop();
int x = u.first, y=u.second;
vector<pair<int,int> > rem;
for(auto it=xs[x].lower_bound(y); it!=xs[x].end(); it++){
if(*it-k>y || !G[x][*it])break;
rem.push_back({x,*it});
q.push({x,*it}); d[x][*it]=d[x][y]+1;
}
clear_rem(rem);
for(auto it=ys[y].lower_bound(x); it!=ys[y].end(); it++){
if(*it-k>x || !G[*it][y])break;
rem.push_back({*it,y});
q.push({*it,y}); d[*it][y]=d[x][y]+1;
}
clear_rem(rem);
auto it=xs[x].lower_bound(y);
if(it!=xs[x].begin()){
it--;
while(1){
if(y-*it>k || !G[x][*it])break;
rem.push_back({x,*it});
q.push({x,*it}); d[x][*it]=d[x][y]+1;
if(it==xs[x].begin())break;
it--;
}
}
clear_rem(rem); it=ys[y].lower_bound(x);
if(it!=ys[y].begin()){
it--;
while(1){
if(x-*it>k || !G[*it][y])break;
rem.push_back({*it,y});
q.push({*it,y}); d[*it][y]=d[x][y]+1;
if(it==ys[y].begin())break;
it--;
}
}
clear_rem(rem);
}
} int main(){ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
memset(d,-1,sizeof(d));
cin >> n >> m >> k;
for(int x=1; x<=n; x++)
for(int y=1; y<=m; y++){
char c; cin >> c;
G[x][y]=c=='.';
xs[x].insert(y);
ys[y].insert(x);
}
int X, Y; cin >> X >> Y;
bfs(X,Y);
cin >> X >> Y;
cout << d[X][Y] << "\n";
}

  

cf877D的更多相关文章

  1. CodeForces CF877D题解(BFS+STL-set)

    解法\(1:\) 正常的\(bfs\)剪枝是\(\Theta(nm4k)\),这个时间复杂度是只加一个\(vis\)记录的剪枝的,只能保证每个点只进队一次,并不能做到其他的减少时间,所以理论上是过不了 ...

随机推荐

  1. Nginx(一) 简介

    Nginx简介 一款基于异步框架的轻量级高性能的Web 服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器 特点 高并发量:基于 epoll/kqueue 模型开发,支持高并 ...

  2. C语言博客作业6

    本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 作业链接 我在这个课程的目标是 熟悉多分支结构.字符型数据类型和逻辑运算符 这个作业在那个具体方面帮助我实现目标 完成pta作 ...

  3. config 模块

    import configparser #配置文件 config = configparser.ConfigParser()config["DEFAULT"] = {'Server ...

  4. Java8新特性一点通 | 回顾字符转日期&JoinArray使用

    StringToDate日期转换 Join Array使用 StringToDate日期转换 Convert string to date in ISO8601 format 利用LocalDate. ...

  5. 乌班图14更新软件提示错误:https://mirrors.aliyun.com kubernetes-xenial InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY 6A030B21BA07F4FB

    提示如下 获取: https://mirrors.aliyun.com kubernetes-xenial InRelease 忽略 https://mirrors.aliyun.com kubern ...

  6. Django项目在Linux服务器上部署和躺过的坑

    引言 在各方的推荐下,领导让我在测试环境部署之前开发的测试数据预报平台.那么问题来了,既然要在服务器上部署, 就需要准备: 1.linux服务器配置 2.linux安装python环境搭建与配置 3. ...

  7. RPC简单设计方案

    服务端: 启动后,等待客户端发来信息,收到信息后进行处理,返回结果. 客户端: 主线程中发起一次RPC,那么就将信息封装成一个任务,提交到线程池,阻塞等待结果. 线程池中工作线程执行任务,发送信息,等 ...

  8. list练习题—输入工人信息

    1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200 2) 在li4 之前插入一个工人 ...

  9. Linux系统实现ansible自动化安装配置httpd

    1.使用ansible的playbook实现自动化安装httpd 1)首先配置好ansible的hosts文件,让其对应主机能够受ansible控制 提示:我们在主机清单上配置了所管控的主机地址,但是 ...

  10. DOCKER 学习笔记8 Docker Swarm 集群搭建

    前言 在前面的文章中,已经介绍如何在本地通过Docker Machine 创建虚拟Docker 主机,以及也可以在本地Windows 创建虚拟主机,也是可以使用的.这一节,我们将继续学习 Docker ...