广度优先搜索
- 格式:doc
- 大小:45.50 KB
- 文档页数:8
广度优先搜索5、细胞(cell.pas)【问题描述】一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
如阵列: 0234500067103456050020456006710000000089有4个细胞。
【输入格式】整数m,n(m行,n列)矩阵【输出格式】细胞的个数。
【输入样例】cell.in4 10023*******103456050020456006710000000089【输出样例】cell.out4【参考程序】constdi:array[1..4]of -1..1=(0,0,-1,1);dj:array[1..4]of -1..1=(1,-1,0,0);var m,n:byte;b:array[0..51,0..61]of boolean;que:array[1..3000]of record i,j:byte; end;num:word;procedure init;var i,j:byte;ch:char;beginassign(input,'cell.in');reset(input);fillchar(b,sizeof(b),false);num:=0;readln(m,n);for i:=1 to m dobeginfor j:=1 to n dobeginread(ch);if ch<>'0' then b[i,j]:=true;end;readln;end;close(input);end;{init}procedure find(newi,newj:byte);var k:byte;head,tail:word;beginb[newi,newj]:=false;inc(num);with que[1] do begin i:=newi; j:=newj; end;head:=0;tail:=1;repeatinc(head);for k:=1 to 4 doif(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]])thenbegininc(tail);with que[tail] do begin i:=que[head].i+di[k]; j:=que[head].j+dj[k]; end;b[que[tail].i,que[tail].j]:=false;end;until head=tail;end;{find}procedure work;var i,j:byte;beginfor i:=1 to m dofor j:=1 to n doif b[i,j] then find(i,j);end;{work}procedure print;beginassign(output,'cell.out');rewrite(output);writeln(num);close(output);end;{print;}begin{main}init;work;print;end.6、营救【问题描述】铁塔尼号遇险了!他发出了求救信号。
距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。
这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。
船只能从一个格子,移到相邻的四个格子。
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。
【输入格式】第一行为n,下面是一个n*n的0、1矩阵,表示海洋地图最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。
【输出格式】哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。
【输入样例】save.in30011011001 1 3 3【输出样例】save.out4【数据范围】N<=1000【参考程序】constdx:array[1..4]of shortint=(1,-1,0,0);dy:array[1..4]of shortint=(0,0,-1,1);var n,x1,y1,x2,y2:word;map:array[0..1001,0..1001]of char;que:array[1..1000000]of record x,y,dep:word; end; procedure init;var i,j:word;beginassign(input,'save.in');reset(input);assign(output,'save.out');rewrite(output);fillchar(map,sizeof(map),'1');readln(n);for i:=1 to n dobeginfor j:=1 to n doread(map[i,j]);readln;end;readln(x1,y1,x2,y2);close(input);end;{init}procedure work;var head,tail:longword;i:byte;beginwith que[1] do begin x:=x1; y:=y1; dep:=0; end;head:=0;tail:=1;repeatinc(head);for i:=1 to 4 doif(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]<=n)and(map[que[head].x+dx[i],que[head].y+dy[i]]='0')thenbegininc(tail);with que[tail] do begin x:=que[head].x+dx[i]; y:=que[head].y+dy[i]; dep:=que[head].dep+1 end;map[que[tail].x,que[tail].y]:='1';if(que[tail].x=x2)and(que[tail].y=y2)then begin writeln(que[tail].dep); close(output); halt; end;end;until head=tail;end;{work}begin{main}init;work;end.7、硬币翻转(coin.pas)【问题描述】在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上。
现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然)。
求一个最短的操作序列(将每次翻转N-1枚硬币成为一次操作)。
【输入格式】输入只有一行,包含一个自然数N(N为不大于100的偶数)。
【输出格式】输出文件的第一行包含一个整数S,表示最少需要的操作次数。
接下来的S行每行分别表示每次操作后桌上硬币的状态(一行包含N个整数(0或1),表示每个硬币的状态:0——正面向上,和1——反面向上,不允许出现多余空格)。
对于有多种操作方案的情况,则只需输出一种。
【样例输入】coin.in4【样例输出】coin.out40111110000011111【参考程序】var n,head,tail,turn0,turn1:byte;que:array[word]of record pre:word; n0,turn0:byte; end;b:array[0..100]of boolean;procedure init;beginassign(input,'coin.in');reset(input);readln(n);close(input);end;{init}procedure print;var i,j,k:byte;status:string[100];a:array[word]of byte;beginassign(output,'coin.out');rewrite(output);writeln(n);for i:=1 to n do status[i]:='0';j:=0;i:=tail;repeatinc(j);a[j]:=i;i:=que[i].pre;until i=0;for i:=j-1 downto 1 dobeginturn0:=que[a[i]].turn0;turn1:=n-1-que[a[i]].turn0;for k:=1 to n docase status[k] of'0':if turn0>0 then begin status[k]:='1'; dec(turn0); end;'1':if turn1>0 then begin status[k]:='0'; dec(turn1); end;end;for k:=n downto 1 do write(status[k]);writeln;end;close(output);halt;end;{print}procedure work;beginfillchar(b,sizeof(b),true); b[n]:=false;que[1].pre:=0; que[1].n0:=n; que[1].turn0:=0;head:=0;tail:=1;repeatinc(head);for turn0:=0 to n-1 dobeginturn1:=n-1-turn0;if(turn0<=que[head].n0)and(turn1<=n-que[head].n0)and( b[que[head].n0-turn0+turn1])thenbegininc(tail);b[que[head].n0-turn0+turn1]:=false;que[tail].pre:=head;que[tail].n0:=que[head].n0-turn0+turn1;que[tail].turn0:=turn0;if que[tail].n0=0 then print;end;end;until head=tail;end;{work}begin{main}init;work;end.8、最少转弯问题(TURN.PAS)【问题描述】给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。