Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- using namespace std;
- typedef long long lli;
- typedef struct coor{
- int r;
- int c;
- }coor;
- typedef struct vstate{
- int r;
- int c;
- int st; /// st[0] = J st[1] = B st[2] = P
- }vstate;
- /// U R D L
- coor ctrl[4] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
- vector<vector<char>> board;
- int row, col;
- lli BFS(coor s, coor e){
- vector<vector<vector<lli>>> dist(row, vector<vector<lli>>(col, vector<lli>(8, -1)));
- queue<vstate> q;
- dist[s.r][s.c][0] = 0;
- q.push({s.r, s.c, 0});
- while(!q.empty()){
- int ur = q.front().r;
- int uc = q.front().c;
- int st = q.front().st;
- q.pop();
- for(int i = 0; i < 4; ++i){
- int vr = ur + ctrl[i].r;
- int vc = uc + ctrl[i].c;
- if(vr >= 0 && vr < row && vc >= 0 && vc < col){ // Inside Board
- if(dist[vr][vc][st] == -1 && board[vr][vc] != '#'){
- switch(board[vr][vc]){
- case '.': case 'S':
- dist[vr][vc][st] = dist[ur][uc][st] + 1;
- q.push({vr, vc, st});
- break;
- case 'J':
- if((st & 1) != 0){ // is 001 011 101 111
- dist[vr][vc][st] = dist[ur][uc][st] + 1;
- q.push({vr, vc, st});
- }
- break;
- case 'B':
- if((st & (1 << 1)) != 0){ // is 010 011 110 111
- dist[vr][vc][st] = dist[ur][uc][st] + 1;
- q.push({vr, vc, st});
- }
- break;
- case 'P':
- if((st & (1 << 2)) != 0){ // is 100 110 101 111
- dist[vr][vc][st] = dist[ur][uc][st] + 1;
- q.push({vr, vc, st});
- }
- break;
- case 'j':
- dist[vr][vc][(st | 1)] = dist[ur][uc][st] + 1;
- dist[vr][vc][st] = dist[ur][uc][st] + 1;
- q.push({vr, vc, (st | 1)}); // Add 001 to st
- break;
- case 'b':
- dist[vr][vc][(st | (1 << 1))] = dist[ur][uc][st] + 1;
- dist[vr][vc][st] = dist[ur][uc][st] + 1;
- q.push({vr, vc, (st | (1 << 1))}); // Add 010 to st
- break;
- case 'p':
- dist[vr][vc][(st | (1 << 2))] = dist[ur][uc][st] + 1;
- dist[vr][vc][st] = dist[ur][uc][st] + 1;
- q.push({vr, vc, (st | (1 << 2))}); // Add 100 to st
- break;
- case 'E':
- return dist[ur][uc][st] + 1;
- break;
- }
- }
- }
- }
- }
- return -1;
- }
- int main(){
- char x;
- coor s, e;
- scanf("%d %d", &row, &col);
- board.assign(row + 1, vector<char>(col + 1, '\0'));
- for(int i = 0; i < row; ++i){
- for(int j = 0; j < col; ++j){
- scanf(" %c", &x);
- board[i][j] = x;
- if(x == 'S'){
- s = {i, j};
- } else if(x == 'E'){
- e = {i, j};
- }
- }
- }
- cout << BFS(s, e);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement