Untitled
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...