Untitled

 avatar
unknown
plain_text
a year ago
1.6 kB
6
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