| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | #include <cstdio>#include <cstring>#include <queue>  // Use priority queue to save your time & life.using namespace std;const int N = 100;const int M = 9;const int S = 5;const short dx[4] = {1, 0, -1, 0};const short dy[4] = {0, 1, 0, -1};char map[N][N + 1];short snake[N][N];bool flag[N][N][M + 1];struct Pos {  short r;  short c;  short key;  short kill;  int t;  Pos(short r = 0, short c = 0, short key = 0, short kill = 0, int t = 0)      : r(r), c(c), key(key), kill(kill), t(t) {}  bool operator==(const Pos &that) const {    return this->r == that.r && this->c == that.c && this->key == that.key;  }  bool operator<(const Pos &that) const { return this->t > that.t; }};int main() {  int n, m;  while (scanf("%d %d", &n, &m) != EOF) {    if (n == 0 && m == 0) break;    Pos sun, tang;    int s = 0;    for (int i = 0; i < n; i++) {      scanf("%s", map[i]);      for (int j = 0; j < n; j++) {        if (map[i][j] == 'T') {          tang.r = i;          tang.c = j;          tang.key = m;          tang.t = -1;        } else if (map[i][j] == 'K') {          sun.r = i;          sun.c = j;        } else if (map[i][j] == 'S') {          snake[i][j] = s++;        }      }    }    priority_queue<Pos> q;    q.push(sun);    memset(flag, 0, sizeof(flag));    flag[sun.r][sun.c][0] = true;    while (!q.empty()) {      Pos cur = q.top();      q.pop();      if (cur == tang) {        tang.t = cur.t;        break;      }      for (int i = 0; i < 4; i++) {        int nx = cur.r + dx[i];        int ny = cur.c + dy[i];        if (nx < 0 || n <= nx || ny < 0 || n <= ny) continue;        char grid = map[nx][ny];        if (grid == '#') continue;        if (grid == 'S') {          if (flag[nx][ny][cur.key]) continue;          if (cur.kill & (1 << snake[nx][ny]))            q.emplace(nx, ny, cur.key, cur.kill, cur.t + 1);          else            q.emplace(nx, ny, cur.key, cur.kill | (1 << snake[nx][ny]),                      cur.t + 2);          flag[nx][ny][cur.key] = true;        } else {          if (!flag[nx][ny][cur.key]) {            q.emplace(nx, ny, cur.key, cur.kill, cur.t + 1);            flag[nx][ny][cur.key] = true;          }          if ('1' <= grid && grid <= '9' && grid - '0' == cur.key + 1 &&              !flag[nx][ny][grid - '0']) {  // Get key            q.emplace(nx, ny, grid - '0', cur.kill, cur.t + 1);            flag[nx][ny][grid - '0'] = true;          }        }      }    }    if (tang.t == -1)      printf("impossible\n");    else      printf("%d\n", tang.t);  }  return 0;}
 |