Untitled
unknown
plain_text
2 years ago
2.2 kB
8
Indexable
#include <iostream> #define MAXN 201 #define MAXQ 200000 using namespace std; int N, M; int xStart, yStart, xEnd, yEnd; char map[MAXN][MAXN]; int visit[MAXN][MAXN]; int Q[MAXQ]; int front, rear; int dx[4] = {1, -1, 0, 0}; int dy[4] = {0, 0, 1, -1}; int ans; void push(int x, int y) { rear++; Q[rear%MAXQ] = x; rear++; Q[rear%MAXQ] = y; } int pop() { front++; return Q[front%MAXQ]; } void resetQ() { front = -1; rear = -1; } void input() { cin >> N >> M; cin >> yStart >> xStart >> yEnd >> xEnd; for(int i = 1; i <= M;i++){ for(int j = 1; j <= N; j++){ cin >> map[i][j]; visit[i][j] = -1; } } } void BFS() { resetQ(); push(xStart, yStart); visit[xStart][yStart] = 0; while(front != rear){ int xCur = pop(); int yCur = pop(); for(int i = 0; i < 4; i++){ int xNext = xCur + dx[i]; int yNext = yCur + dy[i]; if(xNext < 1 || yNext < 1 || xNext > M || yNext > N ) continue; while(map[xNext][yNext] == '0' && (visit[xNext][yNext] == -1 || visit[xNext][yNext] >= visit[xCur][yCur] + 1)){ visit[xNext][yNext] = visit[xCur][yCur] +1; if(xNext == xEnd && yNext == yEnd) return; push(xNext, yNext); xNext = xNext + dx[i]; yNext = yNext + dy[i]; } /*while (xNext >= 1 && yNext >= 1 && xNext <= M && yNext <= N && map[xNext][yNext] == '0') { if (visit[xNext][yNext] == -1 || visit[xNext][yNext] >= (visit[xCur][yCur] + 1)) { visit[xNext][yNext] = visit[xCur][yCur] + 1; if (xNext == xEnd && yNext == yEnd) return; push(xNext, yNext); xNext = xNext + dx[i]; yNext = yNext + dy[i]; } else break; }*/ } } } int main() { freopen("input.txt", "r", stdin); int T; cin >> T; for(int tc = 1; tc <= T; tc++){ input(); ans = 0; BFS(); if(visit[xEnd][yEnd] != -1) cout << visit[xEnd][yEnd] - 1<< endl; else cout << "-1" << endl; } return 0; } 3 7 7 1 2 7 5 1111111 0000000 1011000 1011100 1011110 1000000 1111111 7 7 1 2 7 5 1111111 0000011 1011001 1011100 1011110 1000000 1111111 7 7 1 2 7 6 1111111 0000001 1011000 1011100 1011110 1000000 1111111
Editor is loading...