状态: Unaccepted
测评机: Xeost[5]
得分: 0分
提交日期: 2012-3-31 18:30:00
有效耗时: 该状态没有记录
RQNOJ近期在线比赛列表
世界末日之大愚若智 noip模拟赛 时间:2012-4-2 19:00:00 [报名]
测试结果1: 选手程序无输出
测试结果2: 选手程序无输出
测试结果3: 选手程序无输出
测试结果4: 选手程序无输出
测试结果5: 选手程序无输出
测试结果6: 选手程序无输出
测试结果7: 选手程序无输出
测试结果8: 选手程序无输出
测试结果9: 选手程序无输出
测试结果10: 选手程序无输出
#include<stdio.h>
#include<stdlib.h>
struct{
int x,y,s;
}opt[90100]={0};
int mint[320][320]={0},map[320][320]={0},go[4][2]={{1,0},{0,1},{0,-1},{-1,0}},head,tail;
int pd(int x,int y)
{
if(x<0||x>310||y<0||y>310)
return 0;
if(map[x][y]==0||(map[x][y]==1&&opt[head].s+1<mint[x][y]))
return 1;
return 0;
}
void find(int x,int y)
{
tail++;
opt[tail].x=x;
opt[tail].y=y;
opt[tail].s=opt[head].s+1;
if(map[x][y]==0)
{
printf("%d",opt[tail].s);
exit(0);
}
map[x][y]=1;
}
void init()
{
int i,k,m,x,y,t;
scanf("%d\n",&m);
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&t);
map[x][y]=1;
if(mint[x][y]==0||mint[x][y]>t)
mint[x][y]=t;
for(k=0;k<=3;k++)
{ map[x+go[k][0]][y+go[k][1]]=1;
if(mint[x+go[k][0]][y+go[k][1]]==0||mint[x+go[k][0]][y+go[k][1]]>t)
mint[x+go[k][0]][y+go[k][1]]=t;
}
}
}
int main()
{
int i,xx,yy;
init();
head=0;tail=1;
map[0][0]=1;
while(head<tail)
{
head++;
xx=opt[head].x;
yy=opt[head].y;
for(i=0;i<=3;i++)
if(pd(xx+go[i][0],yy+go[i][1]))
find(xx+go[i][0],yy+go[i][1]);
}
printf("-1");
return 0;
}
我帮你调试了好多次,还是没成功!但是我发现你有几个问题,不知道说的是否正确,因为我不是学C的,而是P!
1、head,tail应该是long
2、find函数中应该把mint[x][y]=0;
3、main函数中 if(pd(xx+go[i][0],yy+go[i][1]))是否需要改成 if(pd(xx+go[i][0],yy+go[i][1])==1)
不知道我说的是否正确!也许就是乱讲!
下面把我的P程序发上(AC)
program liuxingy;
const maxn=310;maxv=90010;
flag:array[1..4,0..1] of integer=((1,0),(0,1),(-1,0),(0,-1));
type arr=record
x,y,t:longint;
end;
var m,head,tail:longint;
map:array[-1..maxn,-1..maxn] of 0..1;
mint:array[-1..maxn,-1..maxn] of integer;
opt:array[0..maxv] of arr;
procedure init;
var x,y,i,k,t:longint;
begin
assign(input,'liuxingy.in');reset(input);
assign(output,'liuxingy.out');rewrite(output);
readln(m);
fillchar(map,sizeof(map),0);
fillchar(mint,sizeof(mint),0);
for i:=1 to m do
begin
readln(x,y,t);
map[x,y]:=1;
if (mint[x,y] = 0)or(t < mint[x,y]) then mint[x,y]:=t;
for k:=1 to 4 do
begin
map[x + flag[k,0],y + flag[k,1]]:=1;
if (mint[x + flag[k,0],y + flag[k,1]] = 0)or(t < mint[x + flag[k,0],y + flag[k,1]]) then mint[x + flag[k,0],y + flag[k,1]]:=t;
end;
end;
end;
procedure print1;
begin
write(opt[tail].t);
close(input);close(output);
end;
procedure print2;
begin
write('-1');
close(input);close(output);
end;
function pd(x,y:longint):boolean;
begin
if (x < 0)or(x > 310)or(y < 0)or(y > 310) then exit(false);
if (map[x,y] = 0)or((map[x,y] = 1)and(opt[head].t + 1 < mint[x,y])) then exit(true);
exit(false);
end;
procedure find(x,y:longint);
begin
inc(tail);
opt[tail].x:=x;opt[tail].y:=y;opt[tail].t:=opt[head].t + 1;
if map[x,y] = 0 then begin
print1;
halt;
end;
map[x,y]:=1;mint[x,y]:=0;
end;
procedure main;
var i,xx,yy:longint;
begin
head:=0;tail:=1;
fillchar(opt,sizeof(opt),0);
opt[1].x:=0;opt[1].y:=0;map[0,0]:=1;
while head < tail do
begin
inc(head);
xx:=opt[head].x;yy:=opt[head].y;
for i:=1 to 4 do
if pd(xx + flag[i,0],yy + flag[i,1]) then find(xx + flag[i,0],yy + flag[i,1]);
end;
end;
begin
init;
main;
print2;
end.