zoukankan      html  css  js  c++  java
  • 最小转弯问题

    给一个地图,其中有障碍物,开始人在起点的面对方向任意,求从起点到终点最少转几次弯。

    f[pos,x,y]表示人在(x,y)位置,面向方向pos时的最小步数,用BFS或SPFA即可。

    View Code
      1 program lphone(input,output);
    2 type
    3 node = record
    4 xx,yy,pos : integer;
    5 end;
    6 var
    7 d : array[1..4,0..101,0..101] of longint;
    8 v : array[1..4,0..101,0..101] of boolean;
    9 q : array[0..400000] of node;
    10 a : array[0..101,0..101] of char;
    11 x : array[1..4] of longint=(-1,0,1,0);
    12 y : array[1..4] of longint=(0,1,0,-1);
    13 start,goal : node;
    14 n,m : longint;
    15 procedure init;
    16 var
    17 i,j : longint;
    18 begin
    19 readln(m,n);
    20 for i:=1 to n do
    21 begin
    22 for j:=1 to m do
    23 begin
    24 read(a[i,j]);
    25 if a[i,j]='C' then
    26 if goal.xx=0 then
    27 begin
    28 goal.xx:=i;
    29 goal.yy:=j;
    30 end
    31 else
    32 begin
    33 start.xx:=i;
    34 start.yy:=j;
    35 end;
    36 end;
    37 readln;
    38 end;
    39 end; { init }
    40 procedure spfa;
    41 var
    42 head,tail : longint;
    43 i : longint;
    44 newx,newy,newpos : longint;
    45 begin
    46 fillchar(d,sizeof(d),63);
    47 fillchar(v,sizeof(v),false);
    48 head:=0;
    49 tail:=4;
    50 for i:=1 to 4 do
    51 begin
    52 q[i].xx:=start.xx;
    53 q[i].yy:=start.yy;
    54 q[i].pos:=i;
    55 v[q[i].pos,q[i].xx,q[i].yy]:=true;
    56 d[q[i].pos,q[i].xx,q[i].yy]:=0;
    57 end;
    58 while head<tail do
    59 begin
    60 inc(head);
    61 v[q[head].pos,q[head].xx,q[head].yy]:=false;
    62 newx:=q[head].xx+x[q[head].pos];
    63 newy:=q[head].yy+y[q[head].pos];
    64 if (newx>0)and(newx<=n)and(newy>0)and(newy<=m) then
    65 if a[newx,newy]<>'*' then
    66 if d[q[head].pos,q[head].xx,q[head].yy]<d[q[head].pos,newx,newy] then
    67 begin
    68 d[q[head].pos,newx,newy]:=d[q[head].pos,q[head].xx,q[head].yy];
    69 if not v[q[head].pos,newx,newy] then
    70 begin
    71 inc(tail);
    72 q[tail].xx:=newx;
    73 q[tail].yy:=newy;
    74 q[tail].pos:=q[head].pos;
    75 v[q[head].pos,newx,newy]:=true;
    76 end;
    77 end;
    78 newpos:=q[head].pos+1;
    79 if newpos=5 then
    80 newpos:=1;
    81 if d[q[head].pos,q[head].xx,q[head].yy]+1<d[newpos,q[head].xx,q[head].yy] then
    82 begin
    83 d[newpos,q[head].xx,q[head].yy]:=d[q[head].pos,q[head].xx,q[head].yy]+1;
    84 if not v[newpos,q[head].xx,q[head].yy] then
    85 begin
    86 inc(tail);
    87 q[tail].pos:=newpos;
    88 q[tail].xx:=q[head].xx;
    89 q[tail].yy:=q[head].yy;
    90 v[newpos,q[head].xx,q[head].yy]:=true;
    91 end;
    92 end;
    93 newpos:=q[head].pos-1;
    94 if newpos=0 then
    95 newpos:=4;
    96 if d[q[head].pos,q[head].xx,q[head].yy]+1<d[newpos,q[head].xx,q[head].yy] then
    97 begin
    98 d[newpos,q[head].xx,q[head].yy]:=d[q[head].pos,q[head].xx,q[head].yy]+1;
    99 if not v[newpos,q[head].xx,q[head].yy] then
    100 begin
    101 inc(tail);
    102 q[tail].pos:=newpos;
    103 q[tail].xx:=q[head].xx;
    104 q[tail].yy:=q[head].yy;
    105 v[newpos,q[head].xx,q[head].yy]:=true;
    106 end;
    107 end;
    108 end;
    109 end; { spfa }
    110 procedure print;
    111 var
    112 i,min : longint;
    113 begin
    114 min:=maxlongint>>1;
    115 for i:=1 to 4 do
    116 if d[i,goal.xx,goal.yy]<min then
    117 min:=d[i,goal.xx,goal.yy];
    118 writeln(min);
    119 end; { print }
    120 begin
    121 init;
    122 spfa;
    123 print;
    124 end.



  • 相关阅读:
    CPA财务管理例题汇总
    Vulkan(1)用apispec生成Vulkan库
    Vulkan(0)搭建环境-清空窗口
    [译]可见性判断之门系统
    《资本论》核心思想
    [译]为任意网格计算tangent空间的基向量
    [译]Vulkan教程(33)多重采样
    [译]Vulkan教程(32)生成mipmap
    [译]Vulkan教程(31)加载模型
    [译]Vulkan教程(30)深度缓存
  • 原文地址:https://www.cnblogs.com/neverforget/p/2404679.html
Copyright © 2011-2022 走看看