洪水_纪中1235_bfs

来源:互联网 发布:js时间戳有什么作用 编辑:程序博客网 时间:2024/04/30 05:43

Description

一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安
全的。
森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而
岩石用“X”表示,另画家的住所用“D”表示,画家用“S”表示。
有以下几点需要说明:
1、 每一分钟画家能向四个方向移动一格(上、下、左、右)
2、 每一分钟洪水能蔓延到四个方向的相邻格子(空白区域)
3、 洪水和画家都不能通过岩石区域
4、 画家不能通过洪水区域(同时也不行,即画家不能移到某个格子,该格子在画家达到的同时被洪水蔓延到了,这也是不允许的)
5、 洪水蔓不到画家的住所。
给你森林的地图,编写程序输出最少需要花费多长时间才能从开始的位置赶回家中。

Input

输入第一行包含两个整数R和C(R,C<=50)。
接下来R行每行包含C个字符(“.”、“*”、“X”、“D”或“S”)。地图保证只有一个“D”和一个“S”。

Output

输出画家最快安全到达住所所需的时间,如果画家不可能安全回家则输出“KAKTUS”。

Sample Input

输入1:

3 3

D.*

.S.

输入2:

3 3

D.*

..S

输入3:

3 6

D…*.

.X.X..

….S.

Sample Output

输出1:

3

输出2:

KAKTUS

输出3:

6

题解:

昨天晚上的专题就是暴力搜索,于是乎就想到了搜索
记录洪水和画家的位置分别bfs两次,记录当前点的深度dep[i,j]
若同一位置,画家的深度>=洪水的深度就KAKTUS,否则输出到达房子时的深度

这里是槽点:

  • 这尼玛不止一个洪水的源头啊!!!
  • 这尼玛可能会有没有洪水的情况啊啊啊!!!

代码/pas:

type  axis=record    x,y,w:longint;  end;  state=record    head,tail:longint;    s:array[1..3000]of axis;  end;const  dx:array[1..4]of integer=(-1,1,0,0);  dy:array[1..4]of integer=(0,0,-1,1);var  n,m:longint;  map,t,g:array[-1..100,-1..100]of longint;  sop,fop:axis;  a,b:state;procedure bfs;var  i,x,y:longint;begin  t[fop.x,fop.y]:=maxlongint;  repeat    inc(b.head);    for i:=1 to 4 do    begin      x:=b.s[b.head].x+dx[i];      y:=b.s[b.head].y+dy[i];      if (map[x,y]=1)and(t[x,y]=0) then      begin        inc(b.tail);        b.s[b.tail].x:=x;        b.s[b.tail].y:=y;        b.s[b.tail].w:=b.s[b.head].w+1;        t[x,y]:=b.s[b.tail].w;      end;    end;  until b.head>=b.tail;  fillchar(a,sizeof(a),0);  a.tail:=1;  a.s[1]:=sop;  repeat;    inc(a.head);    if map[a.s[a.head].x,a.s[a.head].y]=2 then    begin      writeln(a.s[a.head].w);      halt;    end;    for i:=1 to 4 do    begin      x:=a.s[a.head].x+dx[i];      y:=a.s[a.head].y+dy[i];      if (map[x,y]in[1,2])and((t[x,y]>a.s[a.head].w+1)or(t[x,y]=0))and(g[x,y]=0) then      begin        inc(a.tail);        a.s[a.tail].x:=x;        a.s[a.tail].y:=y;        a.s[a.tail].w:=a.s[a.head].w+1;        g[x,y]:=a.s[a.tail].w;      end;    end;  until a.head>=a.tail;end;procedure init;var  i,j:longint;  c:char;begin  fillchar(map,sizeof(map),0);  readln(n,m);  for i:=1 to n do  begin    for j:=1 to m do    begin      read(c);      if c='X' then map[i,j]:=0;      if c='.' then map[i,j]:=1;      if c='D' then map[i,j]:=2;      if c='S' then      begin        map[i,j]:=3;        sop.x:=i;        sop.y:=j;      end;      if c='*' then      begin        map[i,j]:=4;        inc(b.tail);        b.s[b.tail].x:=i;        b.s[b.tail].y:=j;      end;    end;    readln;  end;end;begin  init;  bfs;  writeln('KAKTUS');end.
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 墙内线烧了怎么办 如果没买票想进高铁站怎么办 老赖拒绝还款怎么办 gta5资产不兼容怎么办 平板黑屏闪退怎么办 施工证学历不够怎么办 隧道放炮声大怎么办 58工作被骗了怎么办 学历国家不承认怎么办 福州居住证一年到期怎么办 居住证过期2年怎么办 被房东坑了怎么办 房东违反了合同怎么办 上海居住证过期了怎么办 地铁卡消磁了怎么办 学生卡消磁了怎么办 家属院没房产证怎么办 邮箱收不到邮件怎么办 大学宿舍八人间怎么办 高中档案袋拆了怎么办 公派教师回国后怎么办? 事业单位辞职后档案怎么办 学信支付不了怎么办 校外怎么办北邮校园卡 报考身份证丢了怎么办 买房怎么办不取消低保 自考找不到真题怎么办 自考生考研没有档案怎么办 自考本科无学位怎么办 自考学位证书没拿到怎么办 自考毕业证出生日期错误怎么办 成考没有学位证怎么办 评职称学历认证怎么办 国家不承认学历怎么办 高考分数错了怎么办 签合同了不想干怎么办 贵港教育小学插班生怎么办 学校宿舍限瓦怎么办 苹果锁屏后wifi断开怎么办 兼职一天不给钱怎么办 五月孩子掉床怎么办