吧里的大神进,跪求敲下代码,关乎生死命运啊
pascal吧
全部回复
仅看楼主
level 3
输入说明 :
输入档会有多笔资料,每笔资料的开头会有一个正整數 N,N<=100,表示这组资料有几行,接下來N 行字会表示一个迷宫,每行不会超过100 个字元、其中#代表不能走的路、.代表可以走的路、@代表老鼠的位置(可能不只一只喔!),K 代表喵喵的位置(喵喵只有一只!),当N=0 时表示接下來没有测试资料了,迷宫的四周一定会用#围起來且一定是长方型。
输出说明 :
对每组测试资料,请输出離喵喵最近的老鼠的位置(也就是喵喵需要走几格才能站到老鼠所在的位置?),喵喵只能往上、往下、往右、往左走,如果没有喵喵能走到的老鼠请输出= =”(等号空白等号双引号)。 范例输入 :
若题目没有特别说明,则应该以多测资的方式读取,若不知如何读取请参考 a001 的范例程式。3##########
#K......@#
#########
#3#
#########
#K..#
...@###########0
范例输出 :
7= ="
http://cat.nknush.kh.edu.tw/ShowProblem?problemid=b224
2014年04月08日 11点04分 1
level 3
VAR k,j,i,p,x1,y1:longint;flag:boolean; s:string;
f:array[0..100,0..100] of char;
procedure bfs(x,y,n:integer);
begin
if (f[x-1,y]='.') then bfs(x-1,y,n+1);
if (f[x+1,y]='.') then bfs(x+1,y,n+1);
if (f[x,y+1]='.') then bfs(x,y+1,n+1);
if (f[x,y-1]='.') then bfs(x,y-1,n+1);
if f[x,y]='@' then begin flag:=true;write(n);exit;end;
end;
begin
readln(k);
while k<>0 do
begin
fillchar(f,sizeof(f),'#'); flag:=false;
j:=1;
for i:=1 to k do
begin
readln(s);
for j:=1 to length(s) do f[i,j]:=s[j];
end;
for i:=1 to k do
for p:=1 to j do
if f[i,p]='K' then
begin x1:=i;y1:=p;break; end;
bfs(x1,y1,0); if not flag then writeln('= ="');
readln(k);
end;
end.
2014年04月08日 13点04分 2
错误202???
2014年04月08日 13点04分
回复 大丨疯丨狗 :202:堆栈溢出错,这里应该是广度优先搜索,你写的是深度优先搜索,n=100肯定会爆栈
2014年04月10日 05点04分
回复 abslime :那广搜在子程序怎麽写,能帮我改一下吗?
2014年04月10日 07点04分
回复 大丨疯丨狗 :BFS在不在子程序里一样的
2014年04月10日 09点04分
level 11
const dx:array[1..4] of longint=(1,-1,0,0);
dy:array[1..4] of longint=(0,0,1,-1);
var n:longint;
a:array[1..100,1..100] of char;
p:array[1..100,1..100] of boolean;
f:array[1..10000] of record
x,y,s:longint;
end;
procedure init;
var i,j:longint;
s:string;
begin
for i:=1 to n do begin
readln(s);
for j:=1 to length(s) do begin
a[i,j]:=s[j];
if s[j]='K' then begin
p[i,j]:=true;
f[1].x:=i;
f[1].y:=j;
f[1].s:=0;
end;
end;
end;
end;
procedure bfs;
var head,tail,i,nx,ny:longint;
begin
head:=1;
tail:=1;
repeat
for i:=1 to 4 do begin
nx:=f[head].x+dx[i];
ny:=f[head].y+dy[i];
if (a[nx,ny]<>'#')and(p[nx,ny]=false) then begin
inc(tail);
p[nx,ny]:=true;
f[tail].x:=nx;
f[tail].y:=ny;
f[tail].s:=f[head].s+1;
if a[nx,ny]='@' then begin
writeln(f[tail].s);
exit;
end;
end;
end;
inc(head);
until head>tail;
writeln('=="');
end;
begin
readln(n);
while n<>0 do begin
init;
bfs;
readln(n);
end;
end.
2014年04月11日 05点04分 3
感谢感谢。另外想问您一下高精度连加和连乘该怎么办,给个思路
2014年04月13日 12点04分
回复 大丨疯丨狗 :连加可以用高精度乘单精度;连乘可以用快速幂,具体思想是对于a^n,先递归计算出a^(n div 2),在对这个结果进行平方,边界是a^0=1,总计O(log2n)的时间求解。
2014年04月13日 14点04分
回复 abslime :比如类似S=a+a的2次+a的3次+a的4次+...+a的n次,当n很大,怎么用高精度实现呢?不考虑时间问题,就是用数组去模拟这个过程,该怎么办?
2014年04月13日 16点04分
回复 大丨疯丨狗 :模拟的话可以用两个高精度数s,last,最初s=0,last=a循环n次每次令s+=last,last*=a就可以得到答案。如果要更快的话可以令b[i]=a+a^2+...+a^i,则可以记m=n div 2,将bn(就是s)递归为当n为偶数,b[n]=b[m]*(a^(n-m)+1)当n为奇数,b[n]=b[m]*(a^(n-m)+a)+a重复计算就能在log2(n)的时间求解
2014年04月14日 05点04分
1