每次都是样例能过,一交就错(有无大佬看看)

#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;

}

全部评论

相关推荐

牛客60022193...:大厂都招前端,他们觉得AI能替代前端,可能他们公司吊打btaj吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务