题目描述
有一个仅由数字00与11组成的n \times nn×n格迷宫。若你位于一格0上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格1上,那么你可以移动到相邻44格中的某一格00上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入输出格式
输入格式:
第11行为两个正整数n,mn,m。
下面nn行,每行nn个字符,字符只可能是00或者11,字符之间没有空格。
接下来mm行,每行22个用空格分隔的正整数i,ji,j,对应了迷宫中第ii行第jj列的一个格子,询问从这一格开始能移动到多少格。
输出格式:
m*m行,对于每个询问输出相应答案。
这道题我想了很久,想到要保存答案,看着人家都是bfs,我用dfs试了试,发现炸了一个数据。
dfs代码:
const z:array[1..4,1..2]of -1..1=((1,0),(0,1),(-1,0),(0,-1));
var i,j,k:longint;
m,n:longint;
ans:array[0..1001,0..1001]of longint;
b:array[0..1001,0..1001]of boolean;
a:array[0..1001,0..1001]of char;
x,y:array[0..100000]of longint;
sum,h,t,x1,y1:longint;
procedure dfs(x2,y2:longint;last:char); //dfs
var i,j,k:longint;
begin
if not b[x2,y2] or (last=a[x2,y2]) then exit; //特判
inc(sum);
x[sum]:=x2;
y[sum]:=y2;
b[x2,y2]:=false;
for i:=1 to 4 do
dfs(x2+z[i,1],y2+z[i,2],a[x2,y2]);
end;
begin
read(m,h);
readln;
for i:=1 to m do
begin
for j:=1 to m do
begin
read(a[i,j]);
b[i,j]:=true;
end;
readln;
end;
for i:=1 to h do
begin
read(x1,y1);
sum:=0;
if ans[x1,y1]<>0 then writeln(ans[x1,y1]) //如果当前有答案输出
else
begin //没有答案则dfs
dfs(x1,y1,'2');//确保与0,1不同
for j:=1 to sum do
begin
ans[x[j],y[j]]:=sum;
end;
writeln(sum);
end;
end;
end.
bfs:
const z:array[1..4,1..2]of -1..1=((1,0),(0,1),(-1,0),(0,-1));
var i,j,k:longint;
m,n:longint;
ans:array[0..1002,0..1002]of longint;
b:array[0..1002,0..1002]of boolean;
a:array[0..1002,0..1002]of char;
x,y:array[0..1000000]of longint;
sum,h,t,x1,y1:longint;
procedure bfs; //bfs
var i,j,k,h,t:longint;
begin
h:=1;
t:=1;
x[1]:=x1;
y[1]:=y1;
b[x1,y1]:=false;
repeat
for i:=1 to 4 do
if b[x[t]+z[i,1],y[t]+z[i,2]] and (a[x[t]+z[i,1],y[t]+z[i,2]]<>a[x[t],y[t]]) then
begin
b[x[t]+z[i,1],y[t]+z[i,2]]:=false;
inc(h);
x[h]:=x[t]+z[i,1];
y[h]:=y[t]+z[i,2];
end;
inc(t);
until t>h;
for i:=1 to h do
ans[x[i],y[i]]:=h; //保存答案
writeln(h); //输出
end;
begin
read(m,k);
readln;
for i:=1 to m do
begin
for j:=1 to m do
begin
read(a[i,j]);
b[i,j]:=true;
end;
readln;
end;
for i:=1 to k do
begin
readln(x1,y1);
if not b[x1,y1] then writeln(ans[x1,y1]) //如果当前有答案输出
else bfs; //没有bfs
end;
end. //没超
事实证明我这种蒟蒻还是乖乖用bfs orz…