题目大意:给你一个 n*m 的地图,地图元素( ‘S’ 代表你的起始位置,‘E’为终点位置,‘X’为力量之源,‘*’为墙,‘.’为路),给你 T(时间),你必须在T时间内从起始位置找到力量之源,在从力量之源到终点--这里的时间不计!每移动一格时间为1,如果能到达终止位置就输出最小花费时间,负责输出 -1
题目思路:这题为简单的BFS模板题,可以用两边BFS,第一遍从起始位置找到力量之源,若不能找到活时间超过T就直接输出-1并返回,若能就进行第二遍BFS找到终点,若能就输出最小的时间,不能就输出-1!
代码:
#include<iostream>
#include<stdio.h>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,ans,sx,sy,flag;
char Map[505][505];
int vis[505][505];
int fx[4][2]={1,0,-1,0,0,1,0,-1};
void bfs1(int x,int y){
ans=0;
queue<int>q,q1;
q.push(x);
q.push(y);
flag=0;
vis[x][y]=1;
A:printf("");
while(!q.empty()){
x=q.front(),q.pop();
y=q.front(),q.pop();
for(int i=0;i<4;i++){
int h=x+fx[i][0],l=y+fx[i][1];
if(h>=0&&h<n&&l>=0&&l<m&&!vis[h][l]&&Map[h][l]!='*'){
if(Map[h][l]!='X'){q1.push(h),q1.push(l);vis[h][l]=1;}
else {
sx=h,sy=l;
ans++;
flag=1;
return ;
}
}
}
}if(!q1.empty()){
ans++;
swap(q,q1);
while(!q1.empty())q1.pop();
goto A;
}
}
void bfs2(int x,int y){
queue<int>q,q1;
q.push(x);
q.push(y);
vis[x][y]=1;
flag=0;
B:printf("");
while(!q.empty()){
x=q.front(),q.pop();
y=q.front(),q.pop();
for(int i=0;i<4;i++){
int h=x+fx[i][0],l=y+fx[i][1];
if(h>=0&&h<n&&l>=0&&l<m&&!vis[h][l]&&Map[h][l]!='*'){
if(Map[h][l]!='E'){q1.push(h),q1.push(l);vis[h][l]=1;}
else {
ans++;
flag=1;
return ;
}
}
}
}if(!q1.empty()){
ans++;
swap(q,q1);
while(!q1.empty())q1.pop();
goto B;
}
}
int main()
{
int t;
while(cin>>n>>m>>t){
for(int i=0;i<n;i++){
scanf("%s",Map[i]);
for(int j=0;j<m;j++)
if(Map[i][j]=='S')sx=i,sy=j;
}
memset(vis,0,sizeof(vis));
bfs1(sx,sy);
memset(vis,0,sizeof(vis));
if(flag)
{
if(ans>t){
cout<<-1<<endl;
continue;
}
else
bfs2(sx,sy);
}
if(!flag)cout<<"-1"<<endl;
else{
cout<<ans<<endl;
}
}
return 0;
}