求助,BFS经典题目(悬赏1元+关注)
查看原帖
求助,BFS经典题目(悬赏1元+关注)
246331
mystic_qwq楼主2023/9/20 16:20

不知道为什么样例输出3,这个程序加了一些输出用来调试

typedef struct queue{int x,y}queue;
_Bool notsafe[301][301];
M,T[50000],X[50000],Y[50000],d[301][301];
dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
_Bool H[301][301];L;
/*Qsort(L,R){//题目已经有序
  if(L>=R)return;
  int I=L,J=R,xT=t[L],xX=X[L],xY=Y[L],tT,tX,tY;
  do{
    while(I<J&&T[J]>xT)--J;
    if(I<J)tT=xT,xT=T[J],T[j]=tT,tX=xX,xX=X[j],X[j]=tX,tY=xY,xY=Y[j],Y[j]=tY;
    while(i<j&&T[i]<xT)++i;
    if(i<j)tT=xT,xT=T[j],T[j]=tT,tX=xX,xX=X[j],X[j]=tX,tY=xY,xY=Y[j],Y[j]=tY;
  }while(I<J);
  T[L]=xT,X[L]=xX,Y[L]=xY;
  qsort(L,)
}*/
Check(Time){
  int i;
  for(i=L;i<M;++i)
    if(T[i]==Time){
      H[X[i]][Y[i]]=1;
      for(int j=0;j<4;++j){
        int x=X[i]+dx[j],y=Y[i]+dy[j];
        if(x>=0&&x<=300&&y>=0&&y<=300)
          H[x][y]=1;
      }
    }
  L=i;
}
BFS(x,y){
  //putchar('0');
  d[x][y]=0;
  queue Q[100000];
  //putchar('1');
  int head=0,tail=1,Time=0;
  Q[0].x=x,Q[0].y=y;
  Check(Time);
  do{//putchar('1');
    queue f=Q[head++];
    if(!notsafe[f.x][f.y])
      return d[f.x][f.y];
    if(d[f.x][f.y]>Time-1)
      Check(++Time);
    printf("fx=%d fy=%d ft=%d ",f.x,f.y,d[f.x][f.y]);
    for(int i=0;i<4;++i){
      int x=f.x+dx[i],y=f.y+dy[i];
      if(x>=0&&x<=300&&y>=0&y<=300
           &&!H[x][y]&&d[x][y]==-1)printf("x=%d y=%d ",x,y),
        Q[tail].x=x,Q[tail++].y=y,
        d[x][y]=d[f.x][f.y]+1;
    }
    printf("head=%d tail=%d\n",head,tail);
  }while(head<tail);
  return -1;
}
main(){
  memset(d,-1,sizeof(d));
  scanf("%d",&M);
  for(int i=0;i<M;++i){
    scanf("%d%d%d",X+i,Y+i,T+i),notsafe[X[i]][Y[i]]=1;
    for(int j=0;j<4;++j){
      int x=X[i]+dx[j],y=Y[i]+dy[j];
      if(x>=0&&x<=300&y>=0&&y<=300)
        notsafe[x][y]=1;
    }  
  }
  for(int i=0;i<30;++i,puts(""))
    for(int j=0;j<30;++j)
      putchar(notsafe[i][j]?49:48);
  printf("%d",BFS(0,0));
}

2023/9/20 16:20
加载中...