Untitled
unknown
plain_text
a year ago
1.8 kB
5
Indexable
#include<iostream> using namespace std; int mover[8]={-2,-1,1,2,2,1,-1,-2}; int movec[8]={1,2,2,1,-1,-2,-2,-1}; int movekr[8]={-1,-1,0,1,1,1,0,-1}; int movekc[8]={0,1,1,1,0,-1,-1,-1}; struct point{ int x,y; }; char map[100][100]; int t,m,n,xa,ya,xb,yb; int visit[100][100]; void resetvisit(){ for(int i=0;i<m;i++){ for(int j=0;j<n;j++) visit[i][j]=-1; } } class queue{ int rear, front; point mang[10000]; public: queue(){ rear=front=-1; } void push(point a){ rear++; mang[rear].x=a.x; mang[rear].y=a.y; } point pop(){ front++; return mang[front]; } bool isempty(){ return (rear==front); } void reset(){ rear=front=-1; } }; queue q; void bfs(point a){ q.push(a); visit[a.x][a.y]=0; while(!q.isempty()){ point v=q.pop(); for(int h=0;h<8;h++){ point u; u.x=v.x+movekr[h]; u.y=v.y+movekc[h]; if(u.x>=0 && u.x<m && u.y>=0 && u.y<n && visit[u.x][u.y]==-1 && map[u.x][u.y]!='Z' && map[u.x][u.y]!='z'){ visit[u.x][u.y]=visit[v.x][v.y]+1; q.push(u); } } } } int main(){ freopen("input.txt","r",stdin); cin >> t; for(int tc=1;tc<=t;tc++){ cin >> m >> n; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ cin >> map[i][j]; if(map[i][j]=='A'){ xa=i; ya=j; } else if(map[i][j]=='B'){ xb=i; yb=j; } } } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(map[i][j]=='Z'){ for(int h=0;h<8;h++){ int ni=i+mover[h]; int nj=j+movec[h]; if(ni>=0 && ni<m && nj>=0 && nj<n && map[ni][nj]=='.') map[ni][nj]='z'; } } } } point a,b; a.x=xa; a.y=ya; b.x=xb; b.y=yb; resetvisit(); q.reset(); bfs(a); if(visit[xb][yb]==-1) cout << "-1" << endl; else cout << visit[xb][yb] << endl; } return 0; }
Editor is loading...
Leave a Comment