Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef pair<int, int> pii;
- typedef tuple<int, int, int, int, int, int> tppp;
- const int N = 200;
- pii dir[5] = {pii(0, 0), pii(1, 0), pii(0, 1), pii(-1, 0), pii(0, -1)};
- char board[N + 1][N + 2];
- bool visited[N + 1][N + 1][6][1 << 7];
- int row, col;
- bool isInBoard(int r, int c){
- return r >= 1 && r <= row && c >= 1 && c <= col;
- }
- int main(){
- pii st;
- scanf("%d%d", &row, &col);
- int gemCnt = 0;
- queue<tppp> que;
- for(int i = 1; i <= row; ++i){
- for(int j = 1; j <= col; ++j){
- scanf(" %c", &board[i][j]);
- if(board[i][j] == 'S'){
- visited[i][j][1][0] = true;
- que.emplace(i, j, 1, 0, 0, 0);
- board[i][j] = '.';
- } else if(board[i][j] == 'G'){
- board[i][j] = gemCnt + 'A';
- ++gemCnt;
- }
- }
- }
- while(!que.empty()){
- int ur = get<0>(que.front());
- int uc = get<1>(que.front());
- int us = get<2>(que.front());
- int ug = get<3>(que.front());
- int gemCnt = get<4>(que.front());
- int dist = get<5>(que.front());
- que.pop();
- if(gemCnt == 7){
- cout << dist;
- return 0;
- }
- int vs = (us + 1) % 6;
- for(int d = 0; d < 5; ++d){
- int vr = ur + dir[d].first;
- int vc = uc + dir[d].second;
- if(!isInBoard(vr, vc) || board[vr][vc] == '#'){
- continue;
- }
- int vg = ug;
- int vCnt = gemCnt;
- bool req = true;
- if(board[vr][vc] >= '1' && board[vr][vc] <= '6'){
- int reqGem = board[vr][vc] - '0';
- req = (reqGem <= gemCnt) || (reqGem % 6 == vs);
- } else if(board[vr][vc] >= 'A' && board[vr][vc] <= 'G'){
- if((ug & (1 << (board[vr][vc] - 'A'))) == 0){
- vg = (ug | (1 << (board[vr][vc] - 'A')));
- ++vCnt;
- }
- }
- if(req && !visited[vr][vc][vs][vg]){
- visited[vr][vc][vs][vg] = true;
- que.emplace(vr, vc, vs, vg, vCnt, dist + 1);
- }
- }
- }
- cout << "-1";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement