• 神奇的风 (Standard IO)


    题意/Description:

           T博士最近在研究一种神奇的风。
      这种风有一个源头,称之为“风口”。风口的风要么是顺时针的,要么是逆时针的。
      这种风是有能量的。
      这种风是能传播的,如果风口周围都能传播风,风会像这样产生下一级的风:


           (箭头表示风的转向,最中间的是风口,图中风口的风是顺时针的,对于风口的风是逆时针的情形可通过物理模型想象一下或由这个图推理。)
      产生的下一级风的能量依据新产生的风所在的地形决定,有两种可以传递这种风的地形:
      一、平地,下一级风的能量与风口的风能量相等,这种地形用“.”表示。
      二、少量障碍物,下一级风的能量是风口的风能量的一半,这种地形用“*”表示。
      每个新产生的风都能作为新的风口继续产生下一级风。
      此外,还有一种地形是不能传递风的:大量障碍物,用“#”表示。
      如果在风口的某一方向是“#”地形,则该方向不会产生下一级风,其他方向视该位置的地形而定,就是说,如果是“.”或“*”地形则该方向照样传播。
      T博士还发现了这种神奇的风的叠加规则:两股风叠加时,无论它们的转向是否相同,都只保留能量较大的那股风,即风叠加后的能量和转向都与叠加前能量较大的那股风相同。而如果叠加的两股风的能量相同且转向相同,则保留其中任意一股。两股风能量相同且转向不同时叠加的情况未知,因为T博士至今还没碰到这样的情况。
      T博士画了几张地图,他想知道地图上的某点风的转向和能量。

     

    读入/Input

           输入文件wind.in的第一行是两个整数m和n,表示地图大小为m行n列。
      接下来的m行,每行是n个字符,只会是以下的几种:
      “S”表示风口,保证图中有且仅有一个“S”。
      “E”表示目的地,即T博士想知道的那个点。
      “.”“*”“#”见描述。
      第m+2行是一个整数“0”或“1”,分别表示风口的风是顺时针方向或逆时针方向。
      约定“S”处的风能量为16384,“S”和“E”处的地形均为平地。

     

    输出/Output

           输出文件为wind.out。
      若目的地会有风传到,则输出两行:第一行为一个整数,为目的地的风的能量;第二行为一个整数“0”或“1”,表示意义同输入格式。此种情形下保证目的地的风的能量大于0。
      若目的地没有风传到,则输出一行:“There’s no wind!”(双引号内的字符,全英文标点)。

     

    题解/solution

           题目很长,但很容易想到搜索。总之,搜就行了。

     

    代码/Code

     

    const
      dx:array [1..4] of integer=(1,-1,0,0);
      dy:array [1..4] of integer=(0,0,1,-1);
    
    type
      arr=record
        x,y:longint;
      end;
    var
      n,m,x1,x2,y1,y2:longint;
      e:array [0..500001] of arr;
      a:array [0..201,0..201] of char;
      b,v:array [0..201,0..201] of boolean;
      f:array [0..201,0..201] of longint;
    procedure init;
    var
      i,j,t:longint;
    begin
      readln(n,m);
      for i:=1 to n do
        begin
          for j:=1 to m do
            begin
              read(a[i,j]);
              if a[i,j]='S' then
                begin
                  x1:=i; y1:=j;
                  a[i,j]:='.';
                end;
              if a[i,j]='E' then
                begin
                  x2:=i; y2:=j;
                  a[i,j]:='.';
                end;
              if a[i,j]='#' then
                v[i,j]:=true;
            end;
          readln;
        end;
      for i:=0 to n+1 do
        begin
          v[i,0]:=true; v[i,m+1]:=true;
        end;
      for i:=0 to m+1 do
        begin
          v[0,i]:=true; v[n+1,i]:=true;
        end;
      readln(t);
      if t=0 then b[x1,y1]:=false
             else b[x1,y1]:=true;
      f[x1,y1]:=16384;
    end;
    
    function fd(x,y:longint):boolean;
    begin
      exit((x>=1) and (x<=n) and (y>=1) and (y<=m));
    end;
    
    procedure main(x,y:longint);
    var
      i,l,r,tx,ty,tdx,tdy:longint;
    begin
      l:=1; r:=1;
      e[1].x:=x; e[1].y:=y;
      v[x,y]:=true;
      while l<=r do
        begin
          tx:=e[l].x; ty:=e[l].y;
          for i:=1 to 4 do
            begin
              tdx:=tx+dx[i];
              tdy:=ty+dy[i];
              if (not fd(tdx,tdy)) or (a[tdx,tdy]='#') then continue;
              if a[tdx,tdy]='.'  then
                begin
                  if f[tx,ty]>f[tdx,tdy] then
                    begin
                      f[tdx,tdy]:=f[tx][ty];
                      if not b[tx,ty] then b[tdx,tdy]:=true
                                      else b[tdx,tdy]:=false;
                      if not v[tdx,tdy] then
                        begin
                          inc(r);
                          e[r].x:=tdx;
                          e[r].y:=tdy;
                          v[tdx,tdy]:=true;
                        end;
                    end;
                end else
                begin
                  if a[tdx,tdy]='*' then
                    begin
                      if f[tx,ty] div 2>f[tdx,tdy] then
                        begin
                          f[tdx,tdy]:=f[tx,ty] div 2;
                          if not b[tx,ty] then b[tdx,tdy]:=true
                                          else b[tdx,tdy]:=false;
                          if not v[tdx,tdy] then
                            begin
                              inc(r);
                              e[r].x:=tdx;
                              e[r].y:=tdy;
                              v[tdx,tdy]:=true;
                            end;
                        end;
                    end;
                end;
            end;
          inc(l);
          v[tx,ty]:=false;
        end;
    end;
    
    begin
      fillchar(f,sizeof(f),0);
      init;
      main(x1,y1);
      if f[x2,y2]<>0 then
        begin
          writeln(f[x2,y2]);
          if b[x2,y2] then write('1')
                      else write('0');
        end else write('There','''','s no wind!');
    end.
    



  • 相关阅读:
    20175122邱昕 网络对抗技术exp2后门的原理与实践
    2019-2020 20175122邱昕《网络对抗技术》Exp1 PC平台逆向破解
    day04 python——进程和线程
    day 03 python——面向对象编程进阶
    day02 python——面向对象进阶
    day01 python——面向对象编程基础
    day05
    day04 五层模型之间的通信过程及Linux的目录相关内容
    day03 计算机的性能及系统启动
    Linux入门终端命令
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319642.html
Copyright © 2020-2023  润新知