状态: Unaccepted
测评机: Xeond[6]
得分: 10分
提交日期: 2010-10-30 9:03:00
有效耗时: 187毫秒
测试结果1: 通过本测试点|有效耗时187ms
测试结果2: 测试结果错误.错误结果为:4
正确结果应为:81
测试结果3: 输出过少|用户输出数据少于标准输出的50%[标准输出4位|选手输出1位]
测试结果4: 测试结果错误.错误结果为:4
正确结果应为:476
测试结果5: 测试结果错误.错误结果为:4
正确结果应为:439
测试结果6: 测试结果错误.错误结果为:4
正确结果应为:558
测试结果7: 测试结果错误.错误结果为:4
正确结果应为:155
测试结果8: 测试结果错误.错误结果为:4
正确结果应为:581
测试结果9: 测试结果错误.错误结果为:4
正确结果应为:745
测试结果10: 输出过少|用户输出数据少于标准输出的50%[标准输出4位|选手输出1位]
提交代码: view sourceprint?
const
wayx:array[1..4]of -1..1=(-1,0,1,0);
wayy:array[1..4]of -1..1=(0,1,0,-1);
var
aa:array[1..1000000] of record
x:1..1000;
y:1..1000;
a1:longint;
end;
a:array[1..1000,1..1000] of 0..1;
i,j,x,y,n,sum,head,tail,mx,my:longint;
b:array[1..1000,1..1000] of boolean;
s:ansistring;
begin
fillchar(b,sizeof(b),true);
readln(n);
for x:=1 to n do
begin
readln(s); for y:=1 to n do val(s[x],a[x,y]);
end;
readln(x,y);
readln(mx,my);
head:=0; tail:=1; aa[1].x:=x; aa[1].y:=y; aa[1].a1:=0;
while (head<tail) do
begin
inc(head);
for i:=1 to 4 do
begin
x:=aa[head].x; y:=aa[head].y;
if (x+wayx[i]=mx) and (y+wayy[i]=my) then begin writeln(aa[head].a1+1); readln; exit; end;
if b[x+wayx[i],y+wayy[i]] and (a[x+wayx[i],y+wayy[i]]=0) and (x+wayx[i]>0) and (y+wayy[i]>0) and (x+wayx[i]<=n) and (y+wayy[i]<=n) then
begin
inc(tail);
aa[tail].x:=x+wayx[i];
aa[tail].y:=y+wayy[i];
aa[tail].a1:=aa[head].a1+1;
b[x+wayx[i],y+wayy[i]]:=false;
end;
end;
end;
end.
解决这个问题的方法
我们的一般思路是找到新的扩展点后判断是否符合拓展条件 如果符合 压入队列
因为某种原因。。。这样造成了某些合法拓展点被pass掉
现在 我们每得到新的拓展点就压入队列 从队列中取数后再进行判断 这样就可以AC
具体原因我也不知道 但我就是在wa了30多次才发现这个问题
希望某只神牛说明道理。。。[/color]
测评机: Xeond[6]
得分: 100分
提交日期: 2010-10-30 9:59:00
有效耗时: 4484毫秒
测试结果1: 通过本测试点|有效耗时156ms
测试结果2: 通过本测试点|有效耗时157ms
测试结果3: 通过本测试点|有效耗时562ms
测试结果4: 通过本测试点|有效耗时516ms
测试结果5: 通过本测试点|有效耗时500ms
测试结果6: 通过本测试点|有效耗时515ms
测试结果7: 通过本测试点|有效耗时500ms
测试结果8: 通过本测试点|有效耗时516ms
测试结果9: 通过本测试点|有效耗时531ms
测试结果10: 通过本测试点|有效耗时531ms
wayx:array[1..4]of -1..1=(-1,0,1,0);
wayy:array[1..4]of -1..1=(0,1,0,-1);
var
aa:array[1..1000000] of record
x:1..1000;
y:1..1000;
a1:longint;
end;
a:array[1..1000,1..1000] of 0..1;
i,j,x,y,n,sum,head,tail,mx,my:longint;
b:array[1..1000,1..1000] of boolean;
s:ansistring;
begin
fillchar(b,sizeof(b),true);
readln(n);
for x:=1 to n do
begin
readln(s); for y:=1 to n do val(s[y],a[x,y]);
end;
readln(x,y);
readln(mx,my);
head:=0; tail:=1; aa[1].x:=x; aa[1].y:=y; aa[1].a1:=0;
while (head<tail) do
begin
inc(head);
if (aa[head].x=mx) and (aa[head].y=my) then begin writeln(aa[head].a1); exit; end;
for i:=1 to 4 do
begin
x:=aa[head].x; y:=aa[head].y;
if b[x+wayx[i],y+wayy[i]] and (a[x+wayx[i],y+wayy[i]]=0) and (x+wayx[i]>0) and (y+wayy[i]>0) and (x+wayx[i]<=n) and (y+wayy[i]<=n) then
begin
inc(tail);
aa[tail].x:=x+wayx[i];
aa[tail].y:=y+wayy[i];
aa[tail].a1:=aa[head].a1+1;
b[x+wayx[i],y+wayy[i]]:=false;
end;
end;
end;
end.
