题目大意:
给定 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.