每次都是样例能过,一交就错(有无大佬看看)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
char map[40][40];
int time[40][40];
int q[80][2];//模拟队列
int qq[1600][2];
int sx,sy,ex,ey,hx,hy;//开始,结束,火源的坐标地点
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int n,m;
int ox[]={0,0,1,1,1,-1,-1,-1};
int oy[]={1,-1,1,0,-1,1,0,-1};
void bfs(){
memset(time,-1,sizeof(time));
memset(q,0,sizeof(q));
memset(qq,0,sizeof(qq));
int h,t,hh,tt;
h=t=hh=tt=0;
q[0][0]=sx;
q[0][1]=sy;
qq[0][0]=hx;
qq[0][1]=hy;
time[sx][sy]=0;
while(h<=t && hh<=tt){
int x=q[h][0];
int y=q[h][1];
h++;//取队头
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0 && ny>=0 && nx<n && ny<m && map[nx][ny]!='#' && time[nx][ny]==-1){
time[nx][ny]=time[x][y]+1;
t++;
q[t][0]=nx;
q[t][1]=ny;
if(nx==ex && ny==ey){
printf("%d\n",time[nx][ny]);
return;
}
}
}
int gx=qq[hh][0];
int gy=qq[hh][1];
hh++;
for(int i=0;i<8;i++){
int nnx=gx+ox[i];
int nny=gy+oy[i];
if(nnx>=0 && nny>=0 && nnx<n && nny<m){
map[nnx][nny]='#';
tt++;
qq[t][0]=nnx;
qq[t][1]=nny;
}
}
}
printf("T_T\n");
return;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&m);
getchar();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='S'){
sx=i,sy=j;
}
else if(map[i][j]=='E'){
ex=i,ey=j;
}
else if(map[i][j]=='*'){
hx=i,hy=j;
}
}
getchar();
}
bfs();
}
return 0;
}



查看2道真题和解析