Untitled
unknown
plain_text
a year ago
1.6 kB
10
Indexable
#include<iostream>
using namespace std;
int T, n, m;
int xStart, yStart, xFinish, yFinish;
int map[203][203], visit[203][203], direction[203][203];
int dir[4][2] = {0, -1, -1, 0, 0, 1, 1, 0};
int front, rear;
int que[1000000];
void input(){
cin >> m >> n;
cin >> yStart >> xStart >> yFinish >> xFinish;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
char c;
cin >> c;
if(c=='1')
map[i][j]=1;
else
map[i][j]=0;
visit[i][j]=0;
direction[i][j]=0;
}
}
direction[xStart][yStart]=-1;
}
bool checkBorder(int x, int y){
if(x<1 || y<1 || x>n || y>m)
return false;
return true;
}
void solve(int row, int col){
front=rear=0;
que[rear++]=row;
que[rear++]=col;
visit[row][col]=1;
while(rear>front){
int x = que[front++], y = que[front++];
for(int i=0; i<4; i++){
int xx = x + dir[i][0], yy = y + dir[i][1];
if(checkBorder(xx,yy) && map[xx][yy]==0){
int tmp = visit[x][y];
if(i!=direction[x][y]){
tmp++;
}
if(visit[xx][yy]==0){
visit[xx][yy] = tmp;
que[rear++]=xx;
que[rear++]=yy;
direction[xx][yy]=i;
}
else if(tmp<visit[xx][yy]){
visit[xx][yy]=tmp;
que[rear++]=xx;
que[rear++]=yy;
direction[xx][yy]=i;
}
}
}
}
}
int main(){
//freopen("input.txt", "r", stdin);
cin >> T;
for(int tc=1; tc<=T; tc++){
input();
solve(xStart, yStart);
int result = -1;
if(visit[xFinish][yFinish]!=0)
result = visit[xFinish][yFinish]-2;
cout << result << endl;
}
return 0;
}Editor is loading...
Leave a Comment