sicily 1135 飛越原野

Description

勇敢的德魯伊法里奧出色的完成了任務以後,正在迅速的向本身的基地撤退。但因爲後面有着一大羣追兵,因此法里奧要儘快地返回基地,不然就會被敵人捉住。 node

終於,法里奧來到了最後的一站:泰拉希爾原野,穿過這裏就能夠回到基地了。然而,敵人依然緊追不捨。不過,泰拉希爾的地理條件對法里奧十分有利,衆多的湖泊隨處分佈。敵人須要繞道而行,但法里奧擁有變成鷹的特殊能力,使得他能輕輕鬆鬆的飛越湖面。固然,爲了保證安全起見,法里奧仍是決定找一條能最快回到基地的路。 ios

假設泰拉希爾原野是一個m*n的矩陣,它有兩種地形,P表示平地,L表示湖泊,法里奧只能停留在平地上。他目前的位置在左上角(1,1)處,而目的地爲右下角的(m,n)。法里奧能夠向先後左右四個方向移動或者飛行,每移動一格須要1單位時間。而飛行的時間主要花費在變形上,飛行自己時間消耗很短,因此不管一次飛行多遠的距離,都只須要1單位時間。飛行的途中不能變向,而且一次飛行最終必需要降落在平地上。固然,因爲受到能量的限制,法里奧不能無限制的飛行,他總共最多能夠飛行的距離爲D。在知道了以上的信息以後,請你幫助法里奧計算一下,他最快到達基地所須要的時間。 數組

Input

第一行是3個正整數,m(1m100)n(1n100)D(1D100)。表示原野是m*n的矩陣,法里奧最多隻能飛行距離爲D 安全

接下來的m行每行有n個字符,相互之間沒有空格。P表示當前位置是平地,L則表示湖泊。假定(1,1)(m,n)必定是平地。 spa

Output

一個整數,表示法里奧到達基地須要的最短期。若是沒法到達基地,則輸出impossible  code

Sample Input

4 4 2
PLLP
PPLP
PPPP
PLLP

Sample Output

5

分析:

直接用廣搜法解答便可。要注意總飛行路程爲D,而不是單次的飛行路程,另外不是隻越過湖水的時候才飛的,平地同樣能夠。本題很好的說明了廣度搜索的特性,即應該搜索全部同層的可能狀態,而不是人爲規定同層最優解,最優解是在搜索的過程當中找到的。同時注意,標記是否訪問的數組維度取決於狀態的複雜程度,本題中由於涉及剩餘飛行路程這一變量,必須令標記數組有3個維度。畢竟,不是隻要到達一個點就能夠,還要考慮到達時不一樣的剩餘飛行長度對應不一樣的向下搜素狀態。 orm

代碼:

// Problem#: 1135
// Submission#: 1867544
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

#define MAX 100

struct node{
    int x,y,step,remain;
    node( int a, int b, int c,int r ){
        x = a; y = b; step = c; remain = r;
    }
};

bool _map[MAX][MAX];
bool visit[MAX][MAX][MAX];
int move[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int m,n,d;

inline bool judge( int a, int b ){
    return a>=0 && a<m && b>=0 && b<n;
}

void bfs( int m, int n, int d ){
    memset(visit,false,sizeof(visit));
    queue<node> buffer;
    buffer.push(node(0,0,0,d));
    visit[0][0][d] = true;
    while(!buffer.empty()){
        node tmp = buffer.front();
        buffer.pop();
        if( tmp.x == m-1 && tmp.y == n-1 ){
            cout << tmp.step << endl;
            return ;
        }
        int a,b;
        int c = tmp.step + 1;
        int r = tmp.remain;
        for( int i=0 ; i<4 ; i++ ){
            a = move[i][0] + tmp.x;
            b = move[i][1] + tmp.y;
            if( judge(a,b) && _map[a][b] && !visit[a][b][r] ){
                buffer.push(node(a,b,c,r));
                visit[a][b][r] = true;
            }
            for( int j=2 ; j<=r ; j++ ){
                a += move[i][0];
                b += move[i][1];
                if( judge(a,b) && _map[a][b] && !visit[a][b][r-j] ){
                    buffer.push(node(a,b,c,r-j));
                    visit[a][b][r-j] = true;
                }
            }
        }
    }
    cout << "impossible" << endl;
}

int main(){
    char c;
    cin >> m >> n >> d;
    memset(_map,false,sizeof(_map));
    for( int i=0 ; i<m ; i++ ){
        for( int j=0 ; j<n ; j++ ){
            cin >> c;
            if( c=='P' ) _map[i][j] = true;
        }
    }
    bfs(m,n,d);
    return 0;
}
相關文章
相關標籤/搜索