CodeVS 3344 迷宮 題解

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章