讨论 / 335题求解,无输出
hutianyi 2012-03-31 17:36:00
点我顶贴 收藏 删除
不知道为什么无输出啊

状态: 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;

}

#1 xiaoyangdi@2012-03-31 17:36:00
回复 删除
回复 楼主hutianyi 的帖子

我帮你调试了好多次,还是没成功!但是我发现你有几个问题,不知道说的是否正确,因为我不是学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.

查看更多回复
提交回复