NC208246. 胖胖的牛牛
描述
每逢佳节胖三斤,牛牛在过去的节日里长胖了,连拐弯都困难,甚至会卡在门上,所以他很讨厌拐弯。给你一个N*N(2≤N≤100)的方格中,‘x’表示障碍,‘.’表示没有障碍(可以走),牛牛可以从一个格子走到他相邻的四个格子,但是不能走出这些格子。问牛牛从A点到B点最少需要转90度的弯几次。
输入描述
第一行一个整数:N,下面N 行,每行N 个字符,只出现字符:‘.’,‘x’,‘A’,‘B’;表示上面所说的矩阵格子,每个字符后有一个空格。
输出描述
一个整数:最少转弯次数。如果不能到达,输出-1。
示例1
输入:
3 . x A . . . B x .
输出:
2
C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 400K, 提交时间: 2020-07-02 10:50:30
#include<bits/stdc++.h> #define N 105 using namespace std; int n,m,i,j,k,a,b,f[N][N]; int x,y,xx,yy,q[N*N]; int dx[]={-1,1,0,0},dy[]={0,0,-1,1}; char s[N][N]; int main() { cin>>n; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cin>>s[i][j]; if(s[i][j]=='A') { q[1]=i*N+j; f[i][j]=1; s[i][j]='.'; } if(s[i][j]=='B') { a=i,b=j; s[i][j]='.'; } } } for(i=j=1;i<=j;i++) { x=q[i]/N,y=q[i]%N; for(k=0;k<4;k++) { xx=x+dx[k],yy=y+dy[k]; while(s[xx][yy]=='.') { if(!f[xx][yy]) { f[xx][yy]=f[x][y]+1; q[++j]=xx*N+yy; } xx+=dx[k],yy+=dy[k]; } } } if(f[a][b]) printf("%d\n",f[a][b]-2); else printf("-1\n"); return 0; }