Description

传说中教主乃世外高人,不屑于参加OI竞赛,于是云游四方,威风八面。只不过教主行踪不定,就像传说中的神兽一样可遇而不可求。小L和小H为了求得教主签名的Orz教主T-Shirt,打算碰碰运气展开了冒险。在冒险中,他们不幸被突来的洪水冲到了一个神秘丛林中,他们想尽快逃出这个地方。小L找到了一张看似为曾经的冒险者遗弃的地图,但经过探查,地图所示的确实是这片丛林。小L从地图上看到,有众多河流穿过这片丛林,等到他接近一条最近的河流时,发现水流较急,且河水很深,小H不擅长游泳,所以他们决定利用丛林中的树木做一只竹筏渡河。
  虽然竹筏做好后可以在这一条河所连通的水域任意行进,但是竹筏在上岸后必须抛弃,若想再次渡河必须再做一次竹筏,但这毕竟是十分辛苦的,他们希望做竹筏也就是渡河的次数尽量少,就求助于你。
  地图上的陆地和河流可以抽象冲一个n*n由数字0和1组成的矩阵,其中0代表陆地,1代表河流。无论在陆地上还还是河流上,他们都可以向相邻8格(边相邻或角相邻)移动,但是若要从陆地进入河流(也就是从0到1),则必须制作竹筏。若到达地图边界则顺利逃脱。但是小T和小K有可能迷路,所以会多次询问你,对于每次询问,只要输出到达地图边界需要的最少渡河次数即可,保证每次询问都是指向陆地。
  小L和小H翻到地图的反面,赫然发现六个大字:“教主到此一游”!两人无法抑制自己激动的心情,将这张地图珍藏起来。据说后来这张图成为无价之宝。

Input

第1行包括2个正整数N,K,分别描述了地图的长宽以及询问的次数。
  下面N行,每行N个数字0或者1,数字之间没有空格,描述了这张地图。
  接下来K行,每行2个正整数xi,yi,询问在第xi行第yi列最少需要渡河几次。

Output

输出仅包括1行,按输入顺序每行对于一个询问输出最少需要渡河的次数,数字间用空格隔开,行末换行并没有空格。

Sample Input

9 3
000000000
011111110
010101010
011000110
010000010
010111010
010101010
011111110
000000000
1 3
3 3
4 6

Sample Output

0 1 1

Data Constraint

Hint

【样例说明】
  第1次询问由于已经处于边界所以答案为0。
  第2次询问不断向左或向上走都只要渡河1次。
  第3次询问不断向四个方向中的一个方向走同样只需要1次渡河。

【数据规模】
  对于20%的数据,有n≤10;
  对于40%的数据,有n≤100,k≤10;
  对于60%的数据,有n≤1000,k≤100;
  对于100%的数据,有n≤1000,k≤40000。

题解:
本题一看就是用预处理的方法去做。
看看题意,才发现走到边界就可以逃离。那么,就直接把边界各个点的花费改成0,若是边界是水,就改成1.然后在寻找每个点,寻找这个点的八个方向。若是这个点是陆地,那么找这个点八方的水的花费,若是这个点是水路,那么就找这个点的八方的陆地花费。然后就把这个点可以连到且数字一样的数都改成这个花费,于是就对了。
标程:

typenew=recordx:longint;y:longint;z:longint;end;
vari,j,k,l,n,m,head,tail,took,x,y,cs:longint;a:array[1..1000000] of new;map,land,river:array[1..1000,1..1000] of longint;bz:array[1..1000,1..1000] of boolean;fx:array[1..8,1..2] of longint=((-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1));s:ansistring;
procedure riverbfs(dep:longint);
vari,j,k,l,nx,ny:longint;
beginfor i:=1 to 8 dobeginnx:=a[dep].x+fx[i,1];ny:=a[dep].y+fx[i,2];if(nx>0)and(nx<=n)and(ny>0)and(ny<=n) thenbeginif (bz[nx,ny])and(map[nx,ny]=1) thenbegininc(took);a[took].x:=nx;a[took].y:=ny;bz[nx,ny]:=false;river[nx,ny]:=cs;end;end;end;
end;
procedure landbfs(dep:longint);
vari,j,k,l,nx,ny:longint;
beginfor i:=1 to 8 dobeginnx:=a[dep].x+fx[i,1];ny:=a[dep].y+fx[i,2];if(nx>0)and(nx<=n)and(ny>0)and(ny<=n) thenbeginif (bz[nx,ny])and(map[nx,ny]=0) thenbegininc(took);a[took].x:=nx;a[took].y:=ny;bz[nx,ny]:=false;land[nx,ny]:=cs;end;end;end;
end;
begin//assign(input,'cross_the_river.in');reset(input);readln(n,m);fillchar(bz,sizeof(bz),true);for i:=1 to n dobeginreadln(s);for j:=1 to n dobeginif s[j]='1' then inc(map[i,j]);end;end;for i:=1 to n dobeginif  map[1,i]=0 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=1;a[1].y:=i;land[1,i]:=cs;bz[i,1]:=false;repeatfor j:=head to tail dolandbfs(j);head:=tail+1;tail:=took;until head>tail;end;if  map[n,i]=0 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=n;a[1].y:=i;land[n,i]:=cs;bz[i,1]:=false;repeatfor j:=head to tail dolandbfs(j);head:=tail+1;tail:=took;until head>tail;end;if  map[i,1]=0 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=1;land[i,1]:=cs;bz[i,1]:=false;repeatfor j:=head to tail dolandbfs(j);head:=tail+1;tail:=took;until head>tail;end;if  map[i,n]=0 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=n;land[i,n]:=cs;bz[i,1]:=false;repeatfor j:=head to tail dolandbfs(j);head:=tail+1;tail:=took;until head>tail;end;end;cs:=1;for i:=1 to n dobeginif  map[1,i]=1 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=1;a[1].y:=i;river[1,i]:=cs;bz[i,1]:=false;repeatfor j:=head to tail doriverbfs(j);head:=tail+1;tail:=took;until head>tail;end;if  map[n,i]=1 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=n;a[1].y:=i;river[n,i]:=cs;bz[i,1]:=false;repeatfor j:=head to tail doriverbfs(j);head:=tail+1;tail:=took;until head>tail;end;if  map[i,1]=1 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=1;river[i,1]:=cs;bz[i,1]:=false;repeatfor j:=head to tail doriverbfs(j);head:=tail+1;tail:=took;until head>tail;end;if  map[i,n]=1 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=n;river[i,n]:=cs;bz[i,1]:=false;repeatfor j:=head to tail doriverbfs(j);head:=tail+1;tail:=took;until head>tail;end;end;cs:=0;for i:=2 to n-1 dobeginfor j:=2 to n-1 dobeginif bz[i,j] thenbeginif map[i,j]=0 thenbeginfor k:=1 to 8 dobeginx:=i+fx[k,1];y:=j+fx[k,2];if river[x,y]>0 then cs:=river[x,y]else if (river[x,y]<cs)and(river[x,y]>0) then cs:=river[x,y];end;head:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=j;land[i,j]:=cs;bz[i,j]:=false;repeatfor k:=head to tail dolandbfs(k);head:=tail+1;tail:=took;until head>tail;endelsebeginfor k:=1 to 8 dobeginx:=i+fx[k,1];y:=j+fx[k,2];if land[x,y]>0 then cs:=land[x,y]else if (land[x,y]<cs)and(land[x,y]>0) then cs:=land[x,y];end;head:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=j;river[i,j]:=cs+1;inc(cs);bz[i,j]:=false;repeatfor k:=head to tail doriverbfs(k);head:=tail+1;tail:=took;until head>tail;end;end;end;end;for i:=1 to m dobeginreadln(x,y);write(land[x,y],' ');end;writeln;
end.

转载于:https://www.cnblogs.com/RainbowCrown/p/11148431.html

2017.04.15【NOIP2017提高组】模拟赛B组 T2:渡河相关推荐

  1. 【jzoj】2018.1.30NOIP普及组——模拟赛D组

    @_@ 前言 写博客时间 2018/1/30 22:36. 感想:出数据的dalao我服! 正题 题目1:二项式展开式(jzoj2254) 输入一个整数,求展开(a+b)^n.展开方式为 (a+b)^ ...

  2. 【2020.10.17 牛客 普及组 模拟赛一】T2 牛牛的跳跳棋

    题目描述 牛牛最近在玩一种叫做跳跳棋的游戏,棋盘可以看成是一个一维的线性数组,编号从1到n+1n+1n+1. 一开始牛牛的棋子位于第1个格子,游戏的最终目的是将棋子移动到第n+1n+1n+1个格子. ...

  3. DD 摆磁铁(计蒜客信息学8月普及组模拟赛)

    DD 摆磁铁 这道题来自 计蒜客信息学8月普及组模拟赛 普及组!! 把我一个TG选手看懵了 看来我要回去打普及了 题目大意 给出一个n个节点的树,要把树上给定的2*m个节点两两配对,两个节点配对的产生 ...

  4. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

  5. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  6. GMOJ - 2021.07.20【普及组】模拟赛C组 - 排座椅(seat)、传球游戏(ball)、立体图(drawing)、间谍派遣、seek

    文章目录 luogu博客链接 GMOJ - 2021.07.20[普及组]模拟赛C组 - 排座椅(seat).传球游戏(ball).立体图(drawing).间谍派遣.seek T1 排座椅(seat ...

  7. 计蒜客信息学3月普及组模拟赛

    A. 断幺九 题目链接 分值:100 时间限制:1000ms 测试点数目:10 B. 锈湖 题目链接 分值:100 时间限制:2000ms 测试点数目:10 C. 图  题目链接 分值:100 时间限 ...

  8. 第十二届蓝桥杯(2021年)模拟赛 Python组(第一期) 题目+个人解答

    填空题 填空题-1 [问题描述] 如東整数a是整数b的整数倍,则称b是a的约数. 请问,有多少个正整数是2020的约数. [答案提交] 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一 ...

  9. JZOJ(中山纪念中学) 2018.02.02【NOIP普及组】模拟赛D组

    本次题目:2018.02.02[NOIP普及组]模拟赛D组 第一题 题目:第一题 公牛数字 题意: 求题目给出两个数字的乘积 分析: 这题明显只是考察学生的高精可我居然没做对,只要多练习几次,即可AC ...

  10. 2021-07-16 【普及组】模拟赛C组

    文章目录 2021.07.16[普及组]模拟赛C组 写在前面: T1: 题目大意: 正解: T2: 题目大意: 正解: T3: 题目大意: 正解: T4: 题目大意: 正解: 2021.07.16[普 ...

最新文章

  1. 4.5-4.9 磁盘格式化,磁盘挂载,手动增加swap空间
  2. Docker 入门(Mac环境)- part 5 stacks
  3. 《数据库系统实训》实验报告——视图
  4. LinkedBlockingQueue的put,take方法
  5. SQL游标使用方法SQL游标使用方法(转)
  6. java8中的map与flatmap区别
  7. 收藏 | 损失函数理解汇总,结合PyTorch1.7和TensorFlow2
  8. Makefile-filter和filter-out
  9. 算法求解中的变量、数组与数据结构(STL 中的容器)
  10. vagrant 网络三种模式
  11. pip安装mysql驱动_windows环境下Python安装mysql驱动遇到“坎”
  12. 测量脉冲宽度仿真proteus
  13. MacBook Pro 触摸板手势突然失效的解决方案
  14. Machine Learning - Coursera 吴恩达机器学习教程 Week4 学习笔记
  15. adf的主要功能之一是_复印机ADF是什么意思
  16. 逃脱者2服务器不稳定,逃脱者2EPIC版新手常见问题解决方法汇总
  17. 2、流程部署-上传到服务数据库,查看当前正在执行任务
  18. 目标跟踪笔记Understanding and Diagnosing Visual Tracking Systems
  19. Field II 超声声场仿真(3): 脉冲-回波响应(原理代码)
  20. android闪光灯测心率,手指放在手机摄像头和闪光灯前检测心率的应用是什么原理?...

热门文章

  1. 2008R2文件服务器迁移到2012R2
  2. Boost库学习(0)
  3. PHP免费的空间www.hostinger.co.uk
  4. .Net面试题(1)
  5. 面试题-两个数值交换
  6. mongoose的基本使用
  7. 《Photoshop Lightroom4 经典教程》—第2课2.2节切换屏幕模式
  8. Android中的跨进程通信方法实例及特点分析(二):ContentProvider
  9. 安全问题-携程可能摊上大事了——崩溃原因分析
  10. CentOS6.3 下启动Oracle service和listener