题目链接:https://www.luogu.org/problem/show?pid=1649
历经千辛万苦,我总算是把这个水题AC了,现在心里总觉得一万只草泥马在奔腾;
这是一道很明显的BFS,然后我也明显的看出来了
但是,我就是WA了很久很久,在调试第一个晚上后,我发现读入是存在空格的,而不是数据问题
然后第二个问题就是,BFS找到的第一个终点不一定就是最优的答案(当然第二个问题是我重新打了一次猛然发现之前没注意的一点)
注意到这两点,其实这道题就没难度了
然后这道题的处理需要注意一个地方就是转弯,有两种方式来处理这个转弯
一:开结构体数组,记录当前点前驱的序号,然后看前驱的坐标和下一个位置的坐标是否有横纵坐标中的一个相等
二:开队列,然后用结构体,结构体里存一个direction(方向),然后定义上下左右分别对应1,2,3,4,如果当前点的方向和下一个拓展的方向相同,如果相同则拓展的方向没转弯
当然如果用数组的话会有一点的麻烦,用队列的话代码难度小一点而且更方便不会超时,我之前用数组也是超过时的,所以还是建议用队列
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 #include<cstdlib> 7 #include<queue> 8 #include<string> 9 #define maxn 105 10 using namespace std; 11 12 const int dx[]={0,-1,1,0,0}; 13 const int dy[]={0,0,0,-1,1}; 14 15 struct node{ 16 int x,y,s,d;//坐标,步数,方向 17 }; 18 19 queue<node>q; 20 int n,map[maxn][maxn],vis[maxn][maxn]; 21 int sx,sy,fx,fy,ans=10002; 22 23 void init() 24 { 25 scanf("%d",&n); 26 for(int i=1;i<=n;i++) 27 for(int j=1;j<=n;j++) 28 { 29 char a; 30 scanf("%c",&a); 31 while(a!=‘A‘&&a!=‘B‘&&a!=‘x‘&&a!=‘.‘) 32 { 33 scanf("%c",&a); 34 } 35 if(a==‘A‘){ 36 sx=i;sy=j; 37 } 38 if(a==‘B‘){ 39 fx=i;fy=j; 40 } 41 if(a==‘x‘){ 42 map[i][j]=1; 43 } 44 } 45 } 46 47 int main() 48 { 49 init(); 50 vis[sx][sy]=1; 51 q.push((node){sx,sy,0,0}); 52 while(!q.empty()) 53 { 54 node e=q.front(); 55 q.pop(); 56 vis[e.x][e.y]=1; 57 for(int i=1;i<=4;i++) 58 { 59 int zx=e.x+dx[i],zy=e.y+dy[i]; 60 if(zx<1||zx>n||zy<1||zy>n)continue; 61 if(map[zx][zy]==0&&vis[zx][zy]==0){ 62 if(i==e.d||e.d==0){ 63 q.push((node){zx,zy,e.s,i}); 64 }else { 65 q.push((node){zx,zy,e.s+1,i}); 66 } 67 } 68 } 69 if(e.x==fx&&e.y==fy){ 70 ans=min(ans,e.s); 71 } 72 } 73 if(ans<=10000)printf("%d",ans); 74 else printf("-1"); 75 }
时间: 2024-10-24 04:43:37