【图论】【poj 3026】Borg Maze

news/2024/8/26 17:27:28

问题

S在迷宫中找A,找到A之后就把它同化,也会帮着S找剩下的A。。就是这样。。给你的是一个字符组成的图……

分析

正常人会想到搜索……当然,但是只是搜索很难实现,仔细读题,我们发现,其实质是在求最小生成树!!!

那么用宽搜的方法计算每两点之间的距离,重新构图,prim即可。为了方便查找,开一个which数组。点的坐标做下标,对应第几个点是数组中的值。

数据特别恶心,读入长和宽之后会出现n多莫名其妙的空格,要单独读图的第一行!!!

code

View Code
program liukee;
type xz = record
x:longint;
y:longint;
z:longint;
end ;

var
d:
array [ 1 .. 4 , 1 .. 2 ] of integer = (( 1 , 0 ),( - 1 , 0 ),( 0 , 1 ),( 0 , - 1 ));
x1,y1:
array [ 1 .. 101 ] of longint;
map:
array [ 0 .. 51 , 0 .. 51 ] of char;
which:
array [ 0 .. 51 , 0 .. 51 ] of longint;
a:
array [ 1 .. 101 , 1 .. 101 ] of longint;
mincost:
array [ 1 .. 101 ] of longint;
zu,n,m,ans,tt,i:longint;

procedure init;
var
i,j:longint;
xxx:char;
s:string;
begin
tt:
= 0 ;
readln(m,n);
readln(s);
for i: = 2 to n do
begin
for j: = 1 to m do
begin
read(map[i,j]);
xxx:
= map[i,j];
if (map[i,j] = ' A ' ) or (map[i,j] = ' S ' ) then
begin
inc(tt);
which[i,j]:
= tt;
x1[tt]:
= i;
y1[tt]:
= j;
end ;
end ;
readln;
end ;
for i: = 1 to m do
begin
map[
1 ,i]: = s[i];
if (map[ 1 ,i] = ' A ' ) or (map[ 1 ,i] = ' S ' ) then
begin
inc(tt);
which[i,j]:
= tt;
x1[tt]:
= i;
y1[tt]:
= j;
end ;
end ;
for i: = length(s) to m do
map[
1 ,i]: = ' ' ;
end ;

procedure doit;
var
q:
array [ 1 .. 100000 ] of xz;
v:
array [ 1 .. 50 , 1 .. 50 ] of boolean;
i,l,r,xx,yy,j:longint;
begin
for i: = 1 to tt do
begin
fillchar(q,sizeof(q),
0 );
fillchar(v,sizeof(v),
0 );
l:
= 0 ;
r:
= 1 ;
q[
1 ].x: = x1[i];
q[
1 ].y: = y1[i];
q[
1 ].z: = 0 ;
v[x1[i],y1[i]]:
= true;
while l < r do
begin
inc(l);
for j: = 1 to 4 do
begin
xx:
= q[l].x + d[j, 1 ];
yy:
= q[l].y + d[j, 2 ];
if (xx > 0 ) and (yy > 0 ) and (xx <= n) and (yy <= m) and (map[xx,yy] <> ' # ' ) and ( not v[xx,yy]) then
begin
if which[xx,yy] <> 0 then
begin
a[i,which[xx,yy]]:
= q[l].z + 1 ;
// a[which[xx,yy],i]: = q[l].z + 1 ;
end ;
inc(r);
q[r].x:
= xx;
q[r].y:
= yy;
q[r].z:
= q[l].z + 1 ;
v[xx,yy]:
= true;
end ;
end ;
end ;
end ;
end ;

procedure prim;
var
i,j,k,min:longint;
begin
for i: = 1 to tt do
for j: = 1 to tt do
if a[i,j] = 0 then a[i,j]: = maxlongint;
mincost[
1 ]: = 0 ;
for i: = 2 to tt do
mincost[i]:
= a[ 1 ,i];
for i: = 1 to tt - 1 do
begin
min:
= maxlongint;
for j: = 1 to tt do
if (mincost[j] < min) and (mincost[j] <> 0 ) then
begin
min:
= mincost[j];
k:
= j;
end ;
inc(ans,min);
mincost[k]:
= 0 ;
for j: = 1 to tt do
if mincost[j] > a[k,j] then mincost[j]: = a[k,j];
end ;
end ;

begin
readln(zu);
for i: = 1 to zu do
begin
ans:
= 0 ;
fillchar(a,sizeof(a),
0 );
fillchar(which,sizeof(which),
0 );
fillchar(mincost,sizeof(mincost),
0 );
init;
doit;
prim;
writeln(ans);
end ;
end .

反思

要仔分析题目,抽象成图论模型。不要被表面现象迷惑。

转载于:https://www.cnblogs.com/liukeke/archive/2011/03/06/1972438.html


http://www.niftyadmin.cn/n/674408.html

相关文章

30天制作操作系统,第一天!

第一天介绍的内容是用二进制编辑器手敲十六进制数&#xff0c;生成img镜像文件&#xff0c;借助模拟器启动“自己的操作系统”&#xff0c; 打印“hello world”&#xff0c; 即下图&#xff01; 然而30天制作操作系统的作者&#xff0c;由于成书时间过于久远&#xff0c;并…

【老孙随笔】解除项目经理焦虑痛苦的良药——谦虚

副标题——谦虚也有益于自身的精神健康&#xff08; 作者&#xff1a;孙继滨 &#xff09; 步入正题前&#xff0c;请允许老孙先给大家重新演绎一个故事 —— 《白雪公主》******************************* 【故事简介】 故事讲的一个美丽的女人的故事。 当然&#xff0c;主人…

揭秘:世界上最毒动物的死亡交配过程

在<nobr>动物</nobr>种群中&#xff0c;隐藏着强烈的自私本能——不惜任何代价以取得生存和成功繁殖。澳大利亚最剧毒的红背蜘蛛就是典型代表。 <nobr>澳大利亚</nobr>雌性红背蜘蛛在交配完后会将雄蜘蛛吃掉&#xff0c;特别是在生活条件艰难、缺…

为什么要选用性能优良的外部DAC?(转载)

我们看一下大量的消费电子产品&#xff0c;如电视机&#xff0c;机顶盒&#xff0c;DVD/蓝光播放机&#xff0c;通常许多SoC器件都集成有内部转换器。表面上看&#xff0c;这是一个很好的概念&#xff0c;芯片具有所有功能&#xff01;然而&#xff0c;并非所有事情都像窗外的玫…

ATM机跨行取款也有理财窍门

5月央行出台规定&#xff0c;将ATM机&#xff08;自动柜员机&#xff09;单日取款上限由过去的5000元提至2万元&#xff0c;短时间内&#xff0c;不少银行已经开始做出这一改进。对于要取额度较大现金的市民来说&#xff0c;在ATM机上取款去哪家银行可省手续费呢&#xff1f;可…

30天制作操作系统 第二天

核心内容&#xff1a;汇编语言重新生成启动镜像 1 工具准备 同样的问题&#xff0c;《30天自制操作系统》提供的汇编器不大适合现在中文windows系统&#xff0c;本人使用NASM工具。 提供一下自己找的工具连接&#xff0c;赚点积分。 https://download.csdn.net/my/uploads …

Ubuntu布置telnet过程

作者: EoHhfy 出自: http://www.linuxdiyf.com 1&#xff09;sudo apt-get install telnetd openbsd-inetd 2&#xff09;more /etc/inetd.conf ## netbios-ssn stream tcp nowait root /usr/sbin/tcpd /usr/sbin/smbd telnet stream tcp nowait telnetd /usr/sbin/tcpd /u…