BFS-Route Planning

題目描述

然而事情並不是Richard想的那麼簡單,等他登陸後他才發現,地圖裏有各種各樣的炸彈和關卡。當Richard經過炸彈的時候,他需要花費1分鐘的時間拆彈;地圖中有關卡對應的通行證,如果Richard拿到了通行證,那麼它就可以通過對應的關卡。現在請你重新爲Richard規劃一條路線,使執行任務的時間最短。

.代表空地

‘#’代表障礙

@代表出發點

*代表任務地點

=代表炸彈

1-4代表通行證

a-d代表關卡

輸入

輸入第一行爲T,即有T組輸入數據(1<=T<=10)

每組數據第一行爲整數N 10≤N≤100,代表地圖的長度和寬度

接下來爲N行,每行N個字符,代表地圖

輸出

輸出一個整數,爲Richard從起點出發到達終點所需的最短時間。

如果Richard無法到達終點,請輸出MISSION FAILED

每組輸出佔一行

樣例輸入

5
@….
.1…
…..
=a###
….*

樣例輸出

8


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#define INF 0xfffffff

using namespace std;

typedef struct node{
    int x,y,t;
    int k,bomb;
}node;

int fmin(int a,int b){return a<b?a:b;}
int dirx[]={0,0,1,0,-1},diry[]={0,1,0,-1,0};
int bombx[10],bomby[10],bombl;
int n,TT;
bool mark[105][105][20][64];
char maze[105][105];

int which_bomb(int x,int y){
    for(int i=1;i<=bombl;++i)
        if(x==bombx[i] && y==bomby[i]) return i;
}

void bfs(node s){

    queue <node> q;
    mark[s.x][s.y][s.k][s.bomb]=true;

    q.push(s);
    while(!q.empty()){
        s=q.front();
        q.pop();
        if(s.t>TT)continue;
        if(maze[s.x][s.y]=='*'){
            TT =fmin(TT, s.t);
            continue ;
        }
        for(int i=1;i<=4;i++){
            node w=s;
            w.x+=dirx[i];
            w.y+=diry[i];
            w.t++;
            if(w.x<1 || w.x>n || w.y<1 || w.y>n || maze[w.x][w.y]=='#') continue;
            char c=maze[w.x][w.y];
            if(c=='='){
                int j=which_bomb(w.x,w.y);
                if((w.bomb&(1<<j))==0){
                    w.bomb |= (1<<j);
                    w.t++;
                }
                if(!mark[w.x][w.y][w.k][w.bomb]){
                    q.push(w);
                    mark[w.x][w.y][w.k][w.bomb]=true;
                }
            }
            else if(isdigit(c)){
                w.k |= (1<<(c-'1'));
                if(!mark[w.x][w.y][w.k][w.bomb]){
                    mark[w.x][w.y][w.k][w.bomb]=true;
                    q.push(w);
                }
            }
            else if(islower(c)){
                if((w.k & (1<<(c-'a'))) && (!mark[w.x][w.y][w.k][w.bomb])){
                   mark[w.x][w.y][w.k][w.bomb]=true;
                    q.push(w);
                }
            }
            else if(!mark[w.x][w.y][w.k][w.bomb]){
                mark[w.x][w.y][w.k][w.bomb]=true;
                q.push(w);
            }
        }
    }
}

int main()
{

    while(scanf("%d",&n)!=EOF){
        node s;
        memset(mark,false,sizeof(mark));
        bombl=0;
        for(int i=1;i<=n;i++){
            scanf("%s",&maze[i][1]);
            for(int j=1;j<=n;j++)
                if(maze[i][j]=='@') s.x=i,s.y=j;
                else if(maze[i][j]=='=') bombx[++bombl]=i,bomby[bombl]=j;
        }
        TT=INF;
        s.k=0;
        s.bomb=0;
        s.t=0;
        bfs(s);
        if(TT==INF )printf("MISSION FAILED\n");
        else printf("%d\n",TT);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章