SSP P2821 I Like Matrix!

题目大意:

给定 k 种移动方式:从 (i,j) 移动到 (i + xk ,j + yk )(xk ,yk > 0)。询问在一个 n ∗ m 的矩阵中,从 (1,1) 出发,可以到达多少个位置

n,m ≤ 100,k ≤ 10

题解:

这题也太水了吧,我还怕栈溢出打了广搜,晕。
每次用K种方法去走,然后能走的点扔到队列里继续延伸,之前弄过的点不用重复弄就可以了。

时间复杂度:O(NMK)

var
    p,v:array [0..101,0..101] of boolean;
    q:array [0..20001,1..2] of longint;
    dx,dy:array [0..11] of longint;
    n,m,k:longint;


procedure init;
var
    i:longint;
begin
    readln(n,m,k);
    for i:=1 to k do
      readln(dx[i],dy[i]);
end;

function check(aa,bb:longint):boolean;
begin
    if (aa<1) or (bb<1) or (aa>n) or (bb>m) then exit(false);
    if p[aa,bb] then exit(false);
    exit(true);
end;

procedure bfs;
var
    head,tail,i,x,y:longint;
begin
    head:=0;
    tail:=1;
    v[1,1]:=true;
    p[1,1]:=true;
    q[1,1]:=1;
    q[1,2]:=1;
    while head<tail do
    begin
          inc(head);
          x:=q[head,1];
          y:=q[head,2];
          for i:=1 to k do
            if check(x+dx[i],y+dy[i]) then
             begin
                  v[x+dx[i],y+dy[i]]:=true;
                  inc(tail);
                  p[x+dx[i],y+dy[i]]:=true;
                  q[tail,1]:=x+dx[i];
                  q[tail,2]:=y+dy[i];
             end;
    end;
end;

procedure print;
var
    i,j,ans:longint;
begin
     ans:=0;
     for i:=1 to n do
       for j:=1 to m do
         if v[i,j] then inc(ans);
     writeln(ans);
end;

procedure main;
begin
     init;
     bfs;
     print;
end;

begin
    main;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值