Untitled

 avatar
unknown
plain_text
a year ago
1.5 kB
4
Indexable
1/4/1/2/3/2/2/2/-1/.../-11

#include<iostream>
using namespace std;

const int INF = 87654321;
int t, tc, n,m, visited[101][101];
char a[101][101];
int front, rear, qX[10001], qY[10001];
int hx[8]={-2,-1,1,2,2,1,-1,-2};
int hy[8]={-1,-2,-2,-1,1,2,2,1};
int kx[8]={-1,-1,-1,0,0,1,1,1};
int ky[8]={-1,0,1,-1,1,-1,0,1};
int startX, startY, endX, endY;

int main(){
	//freopen("input.txt", "r", stdin);
	cin>>t;
	for(tc =1; tc<=t; tc++){
		cin>>n>>m;
		for(int i=0; i<m; i++){
			for(int j=0; j<n; j++){
				visited[i][j] = 7654321;
				cin>>a[i][j];
				if(a[i][j] == 'A'){
					startX = i;
					startY = j;
				}
				if(a[i][j] == 'B'){
					endX = i;
					endY = j;
				}
			}
		}
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
				if(a[i][j]=='Z'){
					for(int z=0;z<8;z++){
						int nx=i+hx[z];
						int ny=j+hy[z];
						if(nx>=0 && nx<m && ny>=0 && ny<n && a[nx][ny]=='.'){
							a[nx][ny]='N';
						}
					}
				}
			}
		}
		int ans=0;
		BFS(startX,startY);
		ans=visited[endX][endY];
		if(ans==7654321) cout<<-1<<endl;
		else cout<<ans-1<<endl;
	}

void BFS(int x, int y){
	front = rear = -1;
	visited[x][y] = 1;
	qX[++rear] = x;
	qY[rear] = y;
	while(front != rear){
		x = qX[++front];
		y = qY[front];
		for(int k =0; k<8; k++){
			int tx = x + kx[k];
			int ty = y + ky[k];
			if(tx>=0 && tx<m && ty>=0 && ty<n && (a[tx][ty] == '.' || a[tx][ty] == 'B') && visited[tx][ty] > visited[x][y] +1){
				qX[++rear] = tx;
				qY[rear] = ty;
				visited[tx][ty] = visited[x][y] + 1;

			}

		}

	}

}
	return 0;
}
Editor is loading...
Leave a Comment