Untitled
unknown
plain_text
a year ago
3.0 kB
4
Indexable
#include <iostream> using namespace std; int T, N, M; char arr[305][305]; int a, b, c, d; int posX[10]; int posY[10]; class Queue{ int front, rear; int q[1000000]; public: Queue(); void enQueue(int value); int deQueue(); bool is_Empty(); void reset(); }; Queue::Queue(){ front = rear = -1; } void Queue::enQueue(int value){ q[++rear] = value; } int Queue::deQueue(){ return q[++front]; } bool Queue::is_Empty(){ if(front == rear){ return true; }else{ return false; } } void Queue::reset(){ front = rear = -1; } int visited[305][305]; Queue rQueue, cQueue; int X[4] = {-1, 1, 0, 0}; int Y[4] = {0, 0, -1, 1}; void BFS(){ while(!rQueue.is_Empty()){ int cr = rQueue.deQueue(); int cc = cQueue.deQueue(); int cnt = 0; for(int i = 0; i < 4; i++){ int nr = cr + X[i]; int nc = cc + Y[i]; if(nr >= 0 && nr < N && nc >= 0 && nc < M && visited[nr][nc] == 0){ if(arr[nr][nc] == 'B'){ visited[nr][nc] = visited[cr][cc] + 2; } if(arr[nr][nc] == 'E' || arr[nr][nc] == 'T'){ visited[nr][nc] = visited[cr][cc] + 1; } rQueue.enQueue(nr); cQueue.enQueue(nc); }else if(nr >= 0 && nr < N && nc >= 0 && nc < M && visited[nr][nc] > 0){ if(arr[nr][nc] == 'B'){ if(visited[nr][nc] > visited[cr][cc] + 2){ visited[nr][nc] = visited[cr][cc] + 2; rQueue.enQueue(nr); cQueue.enQueue(nc); } } if(arr[nr][nc] == 'E' || arr[nr][nc] == 'T'){ if(visited[nr][nc] > visited[cr][cc] + 1){ visited[nr][nc] = visited[cr][cc] + 1; rQueue.enQueue(nr); cQueue.enQueue(nc); } } } } } } int main(){ freopen("input.txt", "rt", stdin); cin >> T; for(int tc = 1; tc <= T; tc++){ cin >> N >> M; cin.ignore(); for(int i = 0; i < N; i++){ for(int j = 0; j < M; j++){ cin >> arr[i][j]; if(arr[i][j] == 'Y'){ a = i; b = j; } if(arr[i][j] == 'T'){ c = i; d = j; } visited[i][j] = 0; } } for(int i = 0; i < N; i++){ for(int j = 0; j < M; j++){ if(arr[i][j] == 'S' || arr[i][j] == 'R'){ visited[i][j] = -1; } } } rQueue.reset(); cQueue.reset(); visited[a][b] = 1; rQueue.enQueue(a); cQueue.enQueue(b); BFS(); cout << "Case #" << tc << endl; if(visited[c][d] != 0){ cout << visited[c][d] - 1 << endl; }else{ cout << -1 << endl; } } return 0; }
Editor is loading...
Leave a Comment