P1141 01迷宫
程序员文章站
2022-05-14 18:17:37
...
题目描述
有一个仅由数字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列的一个格子,询问从这一格开始能移动到多少格。
输出格式:
mm行,对于每个询问输出相应答案。
这道题我想了很久,想到要保存答案,看着人家都是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…
上一篇: 题解 P2010 【回文日期】
下一篇: Spring的几个接口
推荐阅读
-
PHP strtotime('2039-01-01') 返回空
-
一张游览PHP内核迷宫的藏宝图
-
2021-07-01
-
Flutter 即学即用系列博客——01 环境搭建
-
1509:特殊的01串
-
各种迷迷迷宫问题 深搜dfs和广搜bfs做法
-
韩顺平_PHP软件工程师玩转算法公开课(第一季)01_算法重要性_五子棋算法_汉诺塔_回溯算法_学习笔记_源代码图解_PPT文档整理
-
HDU 6113 度度熊的01世界
-
【莫烦强化学习】视频笔记(二)3.Q_Learning算法实现走迷宫
-
POJ3984 迷宫问题记录路径递归 bfs HDU1242 dfs Codeforces25D.Roads in Berland floyd优化 HDU1874畅通工程续 floyd/spfa/dj