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