遭遇战(模拟)

本文介绍了一个基于二人路径模拟的算法实现案例。该算法通过不断调整方向来模拟两个个体在地图上的移动过程,直到它们相遇或者都无法继续移动。文章提供了一段完整的程序代码,包括输入输出流程、地图初始化、个体移动逻辑等关键部分。
摘要由CSDN通过智能技术生成

这里写图片描述

分析:模拟两个人同时走就可以了,只是有点麻烦。

代码

const
  maxn=1100;
var
  dx:array[0..3] of longint=(0,1,0,-1);
  dy:array[0..3] of longint=(1,0,-1,0);
  a,b:array[-1..maxn,-1..maxn] of boolean;
  i,j,x1,y1,x2,y2,d1,d2,tx,ty,q,t,n:longint;
  f1,f2:boolean;

begin
  assign(input,'fight.in');
  assign(output,'fight.out');
  reset(input);
  rewrite(output);
  readln(t);
  for  q:=1 to t do
    begin
      readln(n);
      for i:=-1 to n do
        begin
          a[-1,i]:=false;
          b[-1,i]:=false;
          a[i,-1]:=false;
          b[i,-1]:=false;
        end;
      for i:=0 to n-1 do
        for j:=0 to n-1 do
          begin
            a[i,j]:=true;
            b[i,j]:=true;
          end;
      f1:=true; f2:=true;
      readln(x1,y1,d1);
      readln(x2,y2,d2);
      a[x1,y1]:=false;
      b[x2,y2]:=false;
      while (x1<>x2) or (y1<>y2) do
        begin
          if f1 then
            begin
              tx:=x1+dx[d1]; ty:=y1+dy[d1];
              if a[tx,ty]=false
                then begin
                       inc(d1);
                       if d1>3 then d1:=0;
                       tx:=x1+dx[d1]; ty:=y1+dy[d1];
                       if a[tx,ty]=false then f1:=false;
                     end;
              if f1 then
                begin
                  x1:=tx; y1:=ty; a[x1,y1]:=false;
                end;
            end;
          if f2 then
            begin
              tx:=x2+dx[d2]; ty:=y2+dy[d2];
              if b[tx,ty]=false
                then begin
                       dec(d2);
                       if d2<0 then d2:=3;
                       tx:=x2+dx[d2]; ty:=y2+dy[d2];
                       if b[tx,ty]=false then f2:=false;
                     end;
              if f2
                then begin
                       x2:=tx; y2:=ty; b[x2,y2]:=false;
                     end;
            end;
         if (f1=false) and (f2=false) then break;
    end;
    if (x1=x2) and (y1=y2)
      then writeln(x1,' ',y1)
      else writeln(-1);
  end;
  close(input);close(output);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值