Untitled
unknown
plain_text
2 years ago
2.1 kB
5
Indexable
#include <iostream>
using namespace std;
int M,N;
char A[105][105];
int danger[105][105];
int sr,sc,er,ec;
int Qx[11000] = {0};
int Qy[11000] = {0};
int r = -1;
int f = -1;
int vis[105][105] = {0};
int dxma[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
int dyma[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
int dxvua[8] = {-1,-1,0,1,1,1,0,-1};
int dyvua[8] = {0,1,1,1,0,-1,-1,-1};
int ans= 100000;
void Push(int x, int y){
r++;
Qx[r] = x;
Qy[r] = y;
}
void Pop(int &x, int &y){
f++;
x = Qx[f];
y = Qy[f];
}
void BFS(int sR, int sC){
Push(sR,sC);
vis[sR][sC] = 1;
while(r!=f){
Pop(sR,sC);
int nR,nC;
for (int i = 0; i < 8; i++){
nR = sR + dxvua[i];
nC = sC + dyvua[i];
if ( nR >= 0 && nR <= M-1 && nC >=0 && nC <= N-1){
if (danger[nR][nC] == 0 && vis[nR][nC] == 0){
Push(nR,nC);
vis[nR][nC] = vis[sR][sC] + 1;
if (nR == er && nC == ec){
ans = vis[sR][sC] + 1;
}
}
}
}
}
}
int main(){
//freopen("input.txt", "r", stdin);
int T;
cin >> T;
for (int tc = 1; tc <= T; tc++){
cin >> N >> M;
// reset
ans = 100000;
r=f=-1;
for (int i = 0; i < M; i++){
for ( int j = 0; j < N; j++){
vis[i][j] = 0;
danger[i][j] = 0;
}
}
for (int i = 0; i < M; i++){
cin >> A[i];
}
for (int i = 0; i < M; i++){
for ( int j = 0; j < N; j++){
if (A[i][j] == 'A'){
sr = i;
sc = j;
}
if (A[i][j] == 'B'){
er = i;
ec = j;
}
}
}
// add danger
for (int i = 0; i < M; i++){
for ( int j = 0; j < N; j++){
if (A[i][j] == 'Z'){
danger[i][j] = 1;
int xtmp,ytmp;
for ( int k = 0; k < 8; k++){
xtmp = i + dxma[k];
ytmp = j + dyma[k];
if (xtmp >= 0 && xtmp <= M-1 && ytmp >= 0 && ytmp <= N-1){
danger[xtmp][ytmp] = 1;
}
}
}
}
}
danger[sr][sc] = danger[er][ec] = 0;
BFS(sr,sc);
if (ans != 100000){
cout << ans-1 << endl;
}
else cout << -1 << endl;
}
return 0;
}Editor is loading...