FZU 2285 迷宫寻宝

Problem 2285 迷宫寻宝

Accept: 107    Submit: 378
Time Limit: 1000 mSec    Memory Limit : 32768 KB

Problem Description

洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入口、一些墙壁以及一个宝藏。由于迷宫是四连通的,即在迷宫中的一个位置,只能走到与它直接相邻的其他四个位置(上、下、左、右)。现洪尼玛在迷宫的入口处,问他最少需要走几步才能拿到宝藏?若永远无法拿到宝藏,则输出-1。

Input

多组测试数据。

 

输入第一行为正整数n,表示迷宫大小。

 

接下来n行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'#'表示该位置为墙壁,字符'S'表示该位置为入口,字符'E'表示该位置为宝藏,输入数据中只有这四种字符,并且'S'和'E'仅出现一次。

n≤1000

Output

输出拿到宝藏最少需要走的步数,若永远无法拿到宝藏,则输出-1。

Sample Input

5 S.#.. #.#.# #.#.# #...E #....

Sample Output

7

Source

福州大学第十五届程序设计竞赛_重现赛
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
char a[1005][1005];
int n;
int x1,x2,y1,y2;
int dis[1005][1005];
int d[4][2]= {0,1,0,-1,1,0,-1,0};
struct Node
{
    int x,y;
    Node() {}
    Node(int p,int q)
    {
        x=p;
        y=q;
        return ;
    }
};
int pan(int x,int y)
{
    if(0<=x&&x<n&&0<=y&&y<n)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
void bfs()
{
    memset(dis,0,sizeof(dis));
    queue<Node>s;
    s.push(Node(x1,y1));
    dis[x1][y1]=1;
    while(!s.empty())
    {
        Node ma=s.front();
        s.pop();
        for(int i=0;i<4;i++)
        {
            int dx=ma.x+d[i][0];
            int dy=ma.y+d[i][1];
            if(a[dx][dy]!='#'&&!dis[dx][dy]&&pan(dx,dy)==1)
            {
                dis[dx][dy]=dis[ma.x][ma.y]+1;
                s.push(Node(dx,dy));
            }
        }
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=0; i<n; i++)
        {
            scanf("%s",a[i]);
        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                if(a[i][j]=='S')
                {
                    x1=i;
                    y1=j;
                }
                if(a[i][j]=='E')
                {
                    x2=i;
                    y2=j;
                }
            }
        }
        bfs();
        if(dis[x2][y2]==0)
        {
            printf("-1\n");
        }
        else
        {
            printf("%d\n",dis[x2][y2]-1);
        }
    }
}
View Code

 

posted @ 2018-06-06 16:17  NBLX_QAQ  阅读(110)  评论(0编辑  收藏  举报