#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
const int dn[4]={-1, 0, +1, 0};
const int dm[4]={0, +1, 0, -1};
int N, M, ans;
bool flag[100+2][100+2];
char Map[100+2][100+2];
bool word[26+2];
struct NODE{
int n, m;
int step;
}Word[26+2];
NODE que[10000+5];
int place[26+3];
int Sq, Eq, Sp, Ep; //queue
bool check(int n, int m){
if(n<0 || m<0) return false;
if(n>=N || m>=M) return false;
if(Map[n][m]=='2') return false;
if(flag[n][m]) return false;
flag[n][m] = true;
return true;
}
int main(){
freopen("test.in", "r", stdin);
scanf("%d %d\n", &N, &M);
for(int n = 0; n<N; ++n){
for(int m = 0; m<M; ++m){
scanf("%c", &Map[n][m]);
if(Map[n][m]>='A' && Map[n][m]<='Z'){
word[Map[n][m]-'A'] = true;
Word[Map[n][m]-'A'].n = n;
Word[Map[n][m]-'A'].m = m;
}
}
scanf("\n");
}
for(int i = 0; word[i]; ++i) place[Ep++] = i; place[Ep++] = 0;
int s, e;
bool f = true;
NODE node;
while(true){
memset(flag, 0, sizeof(flag));
s = place[Sp++];
if(Sp==Ep) break;
e = place[Sp];
Sq = Eq = 0;
que[Eq++] = Word[s];
f = true;
while(Sq!=Eq && f){
node = que[Sq++];
if(node.n==Word[e].n && node.m==Word[e].m){
ans += node.step;
f = false;
continue;
}
for(int i = 0; i<4; ++i) if(check(node.n+dn[i], node.m+dm[i])){
node.n += dn[i]; node.m += dm[i]; ++node.step;
que[Eq++] = node;
node.n -= dn[i]; node.m -= dm[i]; --node.step;
}
}
if(f){
ans = -1;
break;
}
}
ans==-1 ? printf("Impossible\n") : printf("%d\n", ans);
return 0;
}
CodeVS 3344 迷宮 題解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.