广度优先搜索Word文档格式.docx
《广度优先搜索Word文档格式.docx》由会员分享,可在线阅读,更多相关《广度优先搜索Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
end;
num:
word;
procedureinit;
vari,j:
ch:
char;
begin
assign(input,'
cell.in'
);
reset(input);
fillchar(b,sizeof(b),false);
=0;
readln(m,n);
fori:
=1tomdo
begin
forj:
=1tondo
read(ch);
ifch<
>
'
0'
thenb[i,j]:
=true;
readln;
close(input);
end;
{init}
procedurefind(newi,newj:
byte);
vark:
head,tail:
b[newi,newj]:
=false;
inc(num);
withque[1]dobegini:
=newi;
j:
=newj;
head:
tail:
=1;
repeat
inc(head);
fork:
=1to4do
if(que[head].i+di[k]in[1..m])and(que[head].j+dj[k]in[1..n])and(b[que[head].i+di[k],que[head].j+dj[k]])then
inc(tail);
withque[tail]dobegini:
=que[head].i+di[k];
=que[head].j+dj[k];
b[que[tail].i,que[tail].j]:
untilhead=tail;
{find}
procedurework;
ifb[i,j]thenfind(i,j);
{work}
procedureprint;
assign(output,'
cell.out'
rewrite(output);
writeln(num);
close(output);
{print;
}
begin{main}
init;
work;
print;
end.
6、营救
铁塔尼号遇险了!
他发出了求救信号。
距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。
这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。
船只能从一个格子,移到相邻的四个格子。
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。
【输入格式】
第一行为n,下面是一个n*n的0、1矩阵,表示海洋地图
最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。
【输出格式】
哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。
【输入样例】save.in
3
001
101
100
1133
【输出样例】save.out
【数据范围】
N<
=1000
dx:
array[1..4]ofshortint=(1,-1,0,0);
dy:
array[1..4]ofshortint=(0,0,-1,1);
varn,x1,y1,x2,y2:
map:
array[0..1001,0..1001]ofchar;
array[1..1000000]ofrecordx,y,dep:
save.in'
save.out'
fillchar(map,sizeof(map),'
1'
readln(n);
read(map[i,j]);
readln(x1,y1,x2,y2);
varhead,tail:
longword;
i:
withque[1]dobeginx:
=x1;
y:
=y1;
dep:
if(que[head].x+dx[i]>
0)and(que[head].x+dx[i]<
=n)
and(que[head].y+dy[i]>
0)and(que[head].y+dy[i]<
and(map[que[head].x+dx[i],que[head].y+dy[i]]='
)then
withque[tail]dobeginx:
=que[head].x+dx[i];
=que[head].y+dy[i];
=que[head].dep+1end;
map[que[tail].x,que[tail].y]:
='
;
if(que[tail].x=x2)and(que[tail].y=y2)thenbeginwriteln(que[tail].dep);
halt;
7、硬币翻转(coin.pas)
在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上。
现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然)。
求一个最短的操作序列(将每次翻转N-1枚硬币成为一次操作)。
【输入格式】输入只有一行,包含一个自然数N(N为不大于100的偶数)。
【输出格式】输出文件的第一行包含一个整数S,表示最少需要的操作次数。
接下来的S行每行分别表示每次操作后桌上硬币的状态(一行包含N个整数(0或1),表示每个硬币的状态:
0——正面向上,和1——反面向上,不允许出现多余空格)。
对于有多种操作方案的情况,则只需输出一种。
【样例输入】coin.in
【样例输出】coin.out
0111
1100
0001
1111
varn,head,tail,turn0,turn1:
array[word]ofrecordpre:
n0,turn0:
array[0..100]ofboolean;
coin.in'
vari,j,k:
status:
string[100];
a:
array[word]ofbyte;
coin.out'
writeln(n);
=1tondostatus[i]:
i:
=tail;
inc(j);
a[j]:
=i;
=que[i].pre;
untili=0;
=j-1downto1do
turn0:
=que[a[i]].turn0;
turn1:
=n-1-que[a[i]].turn0;
casestatus[k]of
'
:
ifturn0>
0thenbeginstatus[k]:
dec(turn0);
ifturn1>
dec(turn1);
=ndownto1dowrite(status[k]);
writeln;
{print}
fillchar(b,sizeof(b),true);
b[n]:
que[1].pre:
que[1].n0:
=n;
que[1].turn0:
forturn0:
=0ton-1do
=n-1-turn0;
if(turn0<
=que[head].n0)and(turn1<
=n-que[head].n0)and(b[que[head].n0-turn0+turn1])then
b[que[head].n0-turn0+turn1]:
que[tail].pre:
=head;
que[tail].n0:
=que[head].n0-turn0+turn1;
que[tail].turn0:
=turn0;
ifque[tail].n0=0thenprint;
8、最少转弯问题(TURN.PAS)
给出一张地图,这张地图被分为n×
m(n,m<
=100)个方块,任何一个方块不是平地就是高山。
平地可以通过,高山则不能。
现在你处在地图的(x1,y1)这块平地,问:
你至少需要拐几个弯才能到达目的地(x2,y2)?
你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直或从垂直到水平)的次数。
例如:
如图1,最少的拐弯次数为5。
(x1,y1)
第1行:
n
m
第2至n+1行:
整个地图地形描述(0:
空地;
1:
高山),
如(图1)第2行地形描述为:
1000010
第3行地形描述为:
0010100
……
第n+2行:
x1y1x2y2(分别为起点、终点坐标)
s(即最少的拐弯次数)
【输入输出样例】
(见图1):
TURN.IN
TURN.OUT
57
1000010
0010100
0000101
0110000
0000110
1317
5
varn,m,x1,y1,x2,y2:
array[0..101,0..101]of0..1;
array[1..10000]ofrecordx,y,turns:
shortint;
turn.in'
turn.out'
fillchar(map,sizeof(map),1);
readln(n,m);
if(x1=x2)and(y1=y2)thenbeginwriteln(0);
procedurego(newx,newy:
=newx;
=newy;
turns:
=que[head].turns+1;
if(newx=x2)and(newy=y2)thenbeginwriteln(que[tail].turns);
map[newx,newy]:
{go}
vard:
=-1;
d:
=que[head].x-1;
whilemap[d,que[head].y]=0dobegingo(d,que[head].y);
dec(d);
=que[head].x+1;
inc(d);
=que[head].y-1;
whilemap[que[head].x,d]=0dobegingo(que[head].x,d);
=que[head].y+1;
.