题意:
给一个蜂巢图,问从s到t最短路径长是多少。
思路:
BFS。
1. 不用对地图进行抽象转换,直接在原图上走迷宫:每个格子相邻的有六个格子,所以每步能走六个方向,把六个方向的坐标看好。
2. 不要用vis[][]记录走过与否,memset会超时,直接在原图上标记!
代码:
#include<bits/stdc++.h>
using namespace std;
//Life is Short!
const int N=1005;
char mp[N*5][N*7];
int len[N*5];
struct node{
int x,y,step;
};
int dir[6][2]={
-2,-6,
-4,0,
-2,6,
4,0,
2,-6,
2,6
};
int main(){
int T;
cin>>T;
while(T--){
int r,c,sx,sy;
cin>>r>>c;
getchar();//
for(int i=0;i<4*r+3;++i){
gets(mp[i]);//
len[i]=strlen(mp[i]);
for(int j=0;j<len[i];++j){
if(mp[i][j]=='S'){
sx=i,sy=j;
break;
}
}
}
queue<node>q;
int ans=-1;
q.push({sx,sy,1});
while(!q.empty()&&ans==-1){
auto e=q.front();
if(mp[e.x][e.y]=='T'){
ans=e.step;
break;
}
q.pop();
for(int i=0;i<6;++i){
int nx=e.x+dir[i][0],ny=e.y+dir[i][1];
if(nx>=0&&ny>=0&&nx<4*r+3&&ny<len[nx]&&mp[nx][ny]!='*'&&mp[(e.x+nx)/2][(e.y+ny)/2]!='-'&&mp[(e.x+nx)/2][(e.y+ny)/2]!='/'&&mp[(e.x+nx)/2][(e.y+ny)/2]!='\\'){
if(mp[nx][ny]=='T') {ans=e.step+1;break;}
mp[nx][ny]='*';
q.push({nx,ny,e.step+1});
}
}
}
printf("%d\n",ans);
}
return 0;
}
PS:
1. 看到现场赛的人赛后补这道题,说自己“没有拿牌子的命”云云,我觉得,还是要多练习吧,经验都是平时一点一滴积累的,谁都不可能第一次做就很完美地避开所有坑。希望自己即便很难过,也要坚强起来专注于问题本身,反思自己有哪些不足,然后继续切下一题,不要说自己“没xx的命”之类的自暴自弃的话。加油(ง •_•)ง呀诸位。
2. 我发现我第一次写的代码没有对边界进行判断也A了,数据不强......