【BFS】英雄(hero.cpp/pas)

 

英雄(hero.cpp/pas)

 

题目描述(Description):

城堡迷宫由N×M个格子组成,英雄Mario玛丽奥要在城堡迷宫中从起始点移动到目标点去拯救被怪物掳去的公主,他每一步只能从当前所在的格子移动到相邻的4个格子之一,而且不能移出城堡的范围,走一步需要1秒的时间。

城堡中某些格子里面有弹簧,每个弹簧具有特定的能量K,不同弹簧的K值不一定相同。如果Mario跳到一个有弹簧的格子,他就会继续向前跳,直到Mario跳到一个空的格子或者被墙所阻挡无法继续向前。请你计算Mario从起始点到达目标点(公主位置)需要的最短时间,如果不能到达,输出“Impossible”。

 

输入文件(hero.in):

第一行,两个整数,N和M(3<=N,M<=100),分别表示城堡的行和列。

第二行,一个非负整数K,表示弹簧的数量。接下来K行,每行含3个正整数——X,Y,P。其中X,Y是弹簧的坐标(2<=X<=N-1,2<=Y<=M-1),P是该弹簧的能量。

接下来最后两行,第一行是Mario的坐标,第二行是公主的坐标。

  注意:输入文件保证没有一个弹簧是挨着城堡围墙的。

输出文件(hero.out):

输出Mario从初始位置到达公主所在位置需要的最短时间(秒)。

如果不能到达,则输出“Impossible”。(引号不需输出)

 

样例(Sample):

Sample Input Case 1:

10 10

1

2 7 5

2 8

1 1

Sample Output Case 1:

3

======================

搜索,注意细节

=============================

const
  dx:array[1..4]of longint=(1,-1,0,0);
  dy:array[1..4]of longint=(0,0,-1,1);
type
  node=record
         x,y:longint;
       end;
var
  n,m:longint;
  k:longint;
  //map:array[1..100,1..100]of longint;
  map_t:array[1..100,1..100]of longint;
  map_tan:array[1..100,1..100]of longint;
  v:array[1..100,1..100]of boolean;
  queue:array[1..20000000]of node;      //152
 // ans:longint;
  s_x,s_y,e_x,e_y:longint;
procedure init;
begin
  assign(input,'hero.in');
  assign(output,'hero.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

procedure bfs;
var
  i:longint;
  l,r:longint;
  x1,y1:longint;
  x,y:longint;
begin
  fillchar(map_t,sizeof(map_t),$7);
  l:=0; r:=1;
  queue[1].x:=s_x; queue[1].y:=s_y;
  map_t[s_x,s_y]:=0;
  v[s_x,s_y]:=false;
  repeat
    inc(l);
    if l=20000001 then l:=1;
    x:=queue[l].x;  y:=queue[l].y;
    for i:=1 to 4 do
      begin
        x1:=queue[l].x; y1:=queue[l].y;
        x1:=x1+dx[i];  y1:=y1+dy[i];
        if (1<=x1)and(x1<=n)and(1<=y1)and(y1<=m) then
         begin
           //x:=x1; y:=y1;
           while (1<=x1)and(x1<=n)and(1<=y1)and(y1<=m)and(map_tan[x1,y1]<>0) do
             begin
              // x:=x1; y:=y1;
               x1:=x1+dx[i]*map_tan[x1,y1];
               y1:=y1+dy[i]*map_tan[x1,y1];
             end;  //判断弹簧连续跳..
           if x1<1 then x1:=1
             else if x1>n then x1:=n
                          else if y1<1 then y1:=1
                                       else if y1>m then y1:=m;
           if map_t[x1,y1]>map_t[x,y]+1 then
             begin
               map_t[x1,y1]:=map_t[x,y]+1;
               if v[x1,y1] then
                begin
                  v[x1,y1]:=false;
                  inc(r);
                  if r=20000001 then r:=1;
                  queue[r].x:=x1;
                  queue[r].y:=y1;
                end;
             end;
         end;
      end;
    v[queue[l].x,queue[l].y]:=true;
  until l>=r;
  if map_t[e_x,e_y]<1000000 then writeln(map_t[e_x,e_y])
                            else writeln('Impossible');
end;

procedure main;
var
  i:longint;
  x,y,p:longint;
begin
  readln(n,m);
  readln(k);
  fillchar(map_tan,sizeof(map_tan),0);
  fillchar(v,sizeof(v),true);
  for i:=1 to k do
    begin
      read(x,y,p);
      map_tan[x,y]:=p;
    end;
  readln(s_x,s_y);
  readln(e_x,e_y);
  //ans:=maxlongint;
  bfs;
end;

begin
  init;
  main;
  terminate;
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常经典的acm程序代码 目录 一.数论 4 1.阶乘最后非零位 4 2. 模线性方程(组) 4 3. 素数表 6 4. 素数随机判定(miller_rabin) 6 5. 质因数分解 7 6. 最大公约数欧拉函数 8 二.图论_匹配 9 1. 二分图最大匹配(hungary邻接表形式) 9 2. 二分图最大匹配(hungary邻接表形式,邻接阵接口) 10 3. 二分图最大匹配(hungary邻接阵形式) 10 4. 二分图最大匹配(hungary正向表形式) 11 5. 二分图最佳匹配(kuhn_munkras邻接阵形式) 11 6. 一般图匹配(邻接表形式) 12 7. 一般图匹配(邻接表形式,邻接阵接口) 13 8. 一般图匹配(邻接阵形式) 14 9. 一般图匹配(正向表形式) 15 三.图论_生成树 16 1. 最小生成树(kruskal邻接表形式) 16 2. 最小生成树(kruskal正向表形式) 17 3. 最小生成树(prim+binary_heap邻接表形式) 19 4. 最小生成树(prim+binary_heap正向表形式) 20 5. 最小生成树(prim+mapped_heap邻接表形式) 21 6. 最小生成树(prim+mapped_heap正向表形式) 22 7. 最小生成树(prim邻接阵形式) 23 8. 最小树形图(邻接阵形式) 24 四.图论_网络流 25 1. 上下界最大流(邻接表形式) 25 2. 上下界最大流(邻接阵形式) 26 3. 上下界最小流(邻接表形式) 27 4. 上下界最小流(邻接阵形式) 29 5. 最大流(邻接表形式) 30 6. 最大流(邻接表形式,邻接阵接口) 31 7. 最大流(邻接阵形式) 32 8. 最大流无流量(邻接阵形式) 32 9. 最小费用最大流(邻接阵形式) 33 五. 图论_最短路径 34 1. 最短路径(单源bellman_ford邻接阵形式) 34 2. 最短路径(单源dijkstra_bfs邻接表形式) 35 3. 最短路径(单源dijkstra_bfs正向表形式) 35 4. 最短路径(单源dijkstra+binary_heap邻接表形式) 36 5. 最短路径(单源dijkstra+binary_heap正向表形式) 37 6. 最短路径(单源dijkstra+mapped_heap邻接表形式) 38 7. 最短路径(单源dijkstra+mapped_heap正向表形式) 39 8. 最短路径(单源dijkstra邻接阵形式) 40 9. 最短路径(多源floyd_warshall邻接阵形式) 40 六. 图论_连通性 41 1. 无向图关键边(dfs邻接阵形式) 41 2. 无向图关键点(dfs邻接阵形式) 42 3. 无向图块(bfs邻接阵形式) 43 4. 无向图连通分支(bfs邻接阵形式) 43 5. 无向图连通分支(dfs邻接阵形式) 44 6. 有向图强连通分支(bfs邻接阵形式) 44 7. 有向图强连通分支(dfs邻接阵形式) 45 8. 有向图最小点基(邻接阵形式) 46 七. 图论_应用 46 1.欧拉回路(邻接阵形式) 46 2. 前序表转化 47 3. 树的优化算法 48 4. 拓扑排序(邻接阵形式). 49 5. 最佳边割集 50 6. 最佳顶点割集 51 7. 最小边割集 52 8. 最小顶点割集 53 9. 最小路径覆盖 55 八. 图论_NP搜索 55 1. 最大团(n小于64)(faster) 55 2. 最大团 58 九. 组合 59 1. 排列组合生成 59 2. 生成gray码 60 3. 置换(polya) 61 4. 字典序全排列 61 5. 字典序组合 62 6. 组合公式 62 十. 数值计算 63 1. 定积分计算(Romberg) 63 2. 多项式求根(牛顿法) 64 3. 周期性方程(追赶法) 66 十一. 几何 67 1. 多边形 67 2. 多边形切割 70 3. 浮点函数 71 4. 几何公式 76 5. 面积 78 6. 球面 79 7. 三角形 79 8. 三维几何 81 9. 凸包(graham) 89 10. 网格(pick) 91 11. 圆 92 12. 整数函数 94 13. 注意 96 十二. 结构 97 1. 并查集 97 2. 并查集扩展(friend_enemy) 98 3. 堆(binary) 98 4. 堆(mapped) 99 5. 矩形切割 99 6. 线段树 100 7. 线段树扩展 102 8. 线段树应用 105 9. 子段和 105 10. 子阵和 105 十三. 其他 106 1. 分数 106 2. 矩阵 108 3. 日期 110 4. 线性方程组(gauss) 111 5. 线性相关 113 十四. 应用 114 1. joseph 114 2. N皇后构造解 115 3. 布尔母函数 115 4. 第k元素 116 5. 幻方构造 116 6. 模式匹配(kmp) 118 7. 逆序对数 118 8. 字符串最小表示 119 9. 最长公共单调子序列 119 10. 最长子序列 120 11. 最大子串匹配 121 12. 最大子段和 122 13. 最大子阵和 123

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值