EOJ1124 bfs

一天,sunny不小心进入了一个迷宫,不仅很难寻找出路,而且有的地方还有怪物,但是sunny有足够的能力杀死怪物,但是需要一定的时间,但是sunny想早一点走出迷宫,所以请你帮助他计算出最少的时间走出迷宫,输出这个最少时间.我们规定每走一格需要时间单位1,杀死怪物也需要时间1,如果不能走到出口,则输出impossible.每次走只能是上下左右4个方向.

Input

每次首先2个数n,m(0<n,m<=200),代表迷宫的高和宽,然后n行,每行m个字符,
'S'代码你现在所在的位置,
'T'代表迷宫的出口,
'#'代表墙,你是不能走的,
'X'代表怪物,
'.'代表路,可以走.

Output

输出最少的时间走出迷宫,不能走出输出impossible.

Sample Input

4 4
S.X.
#..#
..#.
X..T
4 4
S.X.
#..#
..#.
X.#T

Sample Output

6

impossible


题目:EOJ1224

 

分析:bfs,因为是求最短路径,按层次遍历。用队列实现。注意题中访问不同点所花的时间不同,则可用优先队列实现。构造新类型存储每个节点的坐标,访问所用时间。dx[4]={-1,1,0,0},dy[]={0,0,-1,1}表示四个方向。将起点进队,每次出队后,若出队节点为目的点则终止程序,输出答案。否则直到对位空前,每次将此节点相邻但未被访问过的节点进队。若循环至队空说明无法到达此点。

 

AC代码:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <string>

#include <vector>

#include <algorithm>

#include <queue>

 

using namespace std;

 

char map[205][205];

int ans;

bool visited[205][205];

int dx[4]={-1,1,0,0},dy[]={0,0,-1,1};

struct Node{

   int x,y,step;

};

 

bool operator<(const Node a,const Nodeb){

   return a.step>b.step;

}

 

void bfs(int x,int y,int n,int m){

  priority_queue<Node> q;

  Node a,next;

  a.x=x;a.y=y;a.step=0;

  q.push(a);

  while(!q.empty()){

       a=q.top();

       q.pop();

 

       for(int i=0;i<4;++i){

           next.x=a.x+dx[i];

           next.y=a.y+dy[i];

           if(0<=next.x && next.x<n && 0<=next.y&& next.y<m && !visited[next.x][next.y] &&map[next.x][next.y]!='#'){

                if(map[next.x][next.y]=='.')

                    next.step=a.step+1;

                elseif(map[next.x][next.y]=='X')

                    next.step=a.step+2;

                elseif(map[next.x][next.y]=='T') {

                    ans=a.step+1;

                    return ;

               }

                q.push(next);

                visited[next.x][next.y]=true;

           }

       }

   }

  ans=-1;

}

 

int main()

{

   int n,m;

   while(~scanf("%d%d",&n,&m)){

       int i,j,x,y;

       memset(visited,false,sizeof(visited));

       for(i=0;i<n;++i){

           scanf("%s",map[i]);

           for(j=0;j<m;++j){

                if(map[i][j]=='S'){

                    x=i;y=j;

                }

           }

       }

       visited[x][y]=true;

       bfs(x,y,n,m);

       if(ans!=-1)

           cout<<ans<<endl;

       else cout<<"impossible"<<endl;

    }

   return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值