Untitled

 avatar
unknown
plain_text
2 years ago
1.7 kB
4
Indexable
#include<iostream>
using namespace std;
int M, N;
char map[305][305];
int sX, sY;
int endx, endy;
int visit[305][305];

int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};

// Queue
int qx[100000];
int qy[100000];
int front = -1;
int rear = -1;
bool isEmpty(){
	return front == - 1;
}
void push(int x, int y){
	if (front == -1) front = 0;
	rear++;
	qx[rear] = x;
	qy[rear] = y;
}
void pop(){
	if (front >= rear) front = rear = -1;
	else front++;
}

void bfs(int x, int y){
	front = rear = -1;
	push(x,y);
	visit[x][y] = 0;
	while(!isEmpty()){
		int x1 = qx[front];
		int y1 = qy[front];
		pop();
		for (int i = 0; i < 4; i++){
			int x2 = x1 + dx[i];
			int y2 = y1 + dy[i];
			// dijkstra
			if (x2>=0 && x2<M && y2>=0 && y2<N && map[x2][y2]!='S' && map[x2][y2]!='R' && visit[x2][y2] > visit[x1][y1]){
				if (map[x2][y2] == 'T' || map[x2][y2] == 'E' ) {
					if (visit[x2][y2] > visit[x1][y1] + 1){
						visit[x2][y2] = visit[x1][y1] + 1;
						push(x2,y2);
					}
				}
				if (map[x2][y2] == 'B') {
					if (visit[x2][y2] > visit[x1][y1] + 2){
						visit[x2][y2] = visit[x1][y1] + 2;				 
						push(x2,y2);
					}
				}
			}	
		}
	}
}

int main(){
	freopen("input.txt", "r",stdin);
	int TC; cin >> TC;
	int tc;
	for (tc = 1; tc <= TC; tc++){
		cin >> M >> N;
		for (int i = 0; i < M; i++){
			for (int j = 0; j < N; j++){
				visit[i][j] = 1000000;		// reset visit
				cin >> map[i][j];
				if (map[i][j] == 'Y') {
					sX = i;
					sY = j;
				}
				else if (map[i][j] == 'T') {
					endx = i;
					endy = j;
				}
			}	
		}
		bfs(sX,sY);
		
		cout << "Case #" << tc << endl;
		cout << (visit[endx][endy] == 1000000?-1:visit[endx][endy])<< endl;
	}
	return 0;
}
Editor is loading...