题目链接:点击查看

题目大意:给出一个n*m的矩阵,每个点都有一个颜色,颜色的种类不超过40种,如果想从一个点到达另一个点,有两种方法:

  1. 花费一个单位的时间从某种颜色闪现到相同的颜色
  2. 花费一个单位的时间走到相邻的格子中

现在给出 q 个询问,每次询问回答从起点到终点的最短时间

题目分析:因为 q 高达 1e5 ,所以限制了每次询问必须在 O(1) ~ O(logn) 的时间复杂度内回答,所以我们必须预处理,这种题目是第一次见,直接说怎么做吧,首先我们需要预处理出 dis[ color ][ x ][ y ] 数组,代表的是从点 ( x , y ) 到 color 颜色的最短路,这样对于每个询问,我们就可以以每个颜色为中转点维护最小值了,在预处理时和普通的bfs写法大同小异,无非就是每次更新时可能加入多个起点,并且同时需要维护多个状态,具体实现可以参照代码,并不是很难

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e3+100;const int b[4][2]={0,1,0,-1,1,0,-1,0};struct Node
{int x,y;Node(int x,int y):x(x),y(y){};
};int maze[N][N],n,m,k;vector<Node>color[45];//color[k]:(x,y)int dis[45][N][N];//dis[color][x][y]bool vis[N][N],vis_color[45];void bfs(int id)
{memset(vis,false,sizeof(vis));memset(vis_color,false,sizeof(vis_color));queue<Node>q;for(int i=0;i<color[id].size();i++){int x=color[id][i].x,y=color[id][i].y;q.push(Node(x,y));vis[x][y]=true;dis[id][x][y]=0;}vis_color[id]=true;while(q.size()){Node cur=q.front();q.pop();int x=cur.x,y=cur.y;if(!vis_color[maze[x][y]])//使用闪现 {vis_color[maze[x][y]]=true;for(int i=0;i<color[maze[x][y]].size();i++){int xx=color[maze[x][y]][i].x,yy=color[maze[x][y]][i].y;  if(vis[xx][yy])continue;    q.push(Node(xx,yy));vis[xx][yy]=true;dis[id][xx][yy]=dis[id][x][y]+1;}}for(int i=0;i<4;i++)//不使用闪现 {int xx=x+b[i][0];int yy=y+b[i][1];if(xx<=0||xx>n||yy<=0||yy>m)continue;if(vis[xx][yy])continue;vis[xx][yy]=true;q.push(Node(xx,yy));dis[id][xx][yy]=dis[id][x][y]+1;}}
}int main()
{
//#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
//#endif
//  ios::sync_with_stdio(false);scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&maze[i][j]);color[maze[i][j]].push_back(Node(i,j));}for(int i=1;i<=k;i++)//预处理bfs(i);int q;scanf("%d",&q);while(q--){int x1,y1,x2,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);int ans=abs(x1-x2)+abs(y1-y2);for(int i=1;i<=k;i++)ans=min(ans,dis[i][x1][y1]+dis[i][x2][y2]+1);printf("%d\n",ans);}return 0;
}

CodeForces - 1301F Super Jaber(bfs)相关推荐

  1. codeforces1301 F. Super Jaber(多源bfs+枚举)

    F. Super Jaber 最终答案的方案可以分为2种: 不使用传送,即曼哈顿距离. 从起点S到最近(步数最少)的颜色为C的格子x,传送到离终点T最近的颜色也为c的格子y,再走到T(从S到x以及y到 ...

  2. Codeforces Round #619 (Div. 2) F. Super Jaber 多源bfs + 思维转换

    传送门 文章目录 题意: 思路: 题意: 给你一个矩阵,每个格子都有一个颜色kkk,每秒可以移动到相邻矩阵或者瞬移到同一颜色的任意矩阵.有qqq个询问,每次询问给出两个点,求从一个点到另一个点的最短时 ...

  3. CodeForces - 1534E Lost Array(bfs+交互)

    题目链接:点击查看 题目大意:初始时给出一个长度为 nnn 的序列,每次可以询问 kkk 个位置的异或和,现在需要以最少的询问获得整个序列的异或和 题目分析:因为是异或,我们只关心每个位置被询问的次数 ...

  4. CodeForces - 1484D Playlist(循环链表+bfs)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,规定其是一个首尾相接的环,不断的遍历该环,如果满足 gcd(ai,ai+1)==1gcd(a_i,a_{i+1})==1gcd(ai​,a ...

  5. Orac and Game of Life CodeForces - 1350E(思维+BFS)

    Please notice the unusual memory limit of this problem. Orac likes games. Recently he came up with t ...

  6. Valid BFS? CodeForces - 1037D(思维 bfs)

    我真是一只菜狗......emm... 题意: 判断一个从1开始的队列是否可以按照bfs的顺序 进行遍历..必须从1开始...然后后边依次是bfs顺序 解析: 看代码能看懂吧...emm...就是把每 ...

  7. Codeforces - 1176E - Cover it! - bfs

    https://codeforc.es/contest/1176/problem/E 久了不写bfs了.一开始用dfs写,的确用dfs是很有问题的,一些奇怪的情况就会导致多染一些色. 注意无向图的边要 ...

  8. CodeForces - 796D Police Stations bfs

    思路:删除尽量多的边使得所有点都能在限制距离之内到达一个警局,删除边会形成多棵子树,最多只能k棵.其实就是以每个警局为根结点,把整棵树划分为以警局为根结点的k棵树,说明要删除的边的数量就是k-1条,即 ...

  9. B站带我打codeforces(三)

    E. Nanosoft 原题地址 代码: 题目大意:定义一个logo为四个小正方形按(R,G,B,Y)颜色顺序拼成一个大正方形,有q次询问,每次询问输入一个范围,求图中这个范围内的面积最大商标 由于q ...

最新文章

  1. MySQL内核源码解读-SQL解析之解析器浅析
  2. 数据库、缓存、消息队列之外的下一站——Elasticsearch
  3. bootstrap 两个轮播图冲突_为什么使用bootstrap在一个页面同时做两个轮播效果时,只有第一个有效??...
  4. Iometer存储测试工具参数说明-图形主界面(整理)
  5. MS SQL Server存储过程的优点有哪些呢?
  6. 用户画像方法论与工程化解决方案 pdf_《用户画像》作者:赵宏田
  7. 电脑上找不到蓝牙图标,怎么打开蓝牙,三种方法教你打开蓝牙。
  8. 华为 RS RSTP原理与配置复习笔记
  9. Spark 推测执行
  10. java sequencer_UVM学习笔记--sequence和sequencer(转)
  11. H5实现调用本地摄像头实现实时视频以及拍照功能
  12. 苹果手机怎么在照片上添加文字_要给照片快速添加文字、图框、印章,用这款手机软件比较方便...
  13. 计算机的ip地址和用户名和密码是什么原因,电脑的ip地址账户和密码忘记怎么办...
  14. 施乐服务器怎么显示浏览器,怎么才能显示出电脑IE浏览器的菜单栏和工具栏
  15. matlab专业代做hslogic,MATLAB代做|FPGA代做--OLA算法的仿真与分析
  16. google翻译的用法 使用translate.google.com翻译整个网页内容
  17. 基于遗传算法的BP神经网络优化算法(附代码)
  18. Dell 服务器 用板载网口访问iDrac 并设置风扇静音
  19. kafka消息系统-海量数据迁移方案
  20. 大数据漫谈2:大数据价值点在哪里

热门文章

  1. java消费者中url找不到,java – URL可以使用浏览器访问,但是仍然是具有URLConnection的FileNotFoundException...
  2. Nginx server_name通配符匹配配置
  3. BeanFactory 和ApplicationContext 有什么区别?
  4. ThreadLocal的重要方法介绍
  5. 构建eureka高可用服务
  6. 非对称加密算法 - Java加密与安全
  7. jvm_虚拟机参数讲解(一)
  8. php实现享元模式,php设计模式 flyweight (享元模式)
  9. 彻底搞清楚浏览器渲染过程
  10. C#窗体内控件大小随窗体等比例变化