SSP P2821 I Like Matrix!

来源:互联网 发布:八字不合怎么办知乎 编辑:程序博客网 时间:2024/06/01 16:55

题目大意:

给定 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.
原创粉丝点击