链接:https://ac.nowcoder.com/acm/contest/330/C
来源:牛客网
题目描述
精通程序设计的 Applese 双写了一个游戏。
在这个游戏中,它被困在了一个 n×m的迷宫中,它想要逃出这个迷宫。
在迷宫中,有一些方格是水池,只有当 Applese 处于水属性的时候才可以通过;有一些方格是岩浆,只有当 Applese 是火属性的时候可以通过;有一些方格是墙壁,无论如何都无法通过;另一些格子是空地(包括起点和终点),可以自由通过。
在一些空地上有神秘道具可以让 Applese 转换自己的属性(从水属性变为火属性或从火属性变为水属性,需要一个单位的时间)。
已知 Applese 在一个单位的时间内可以朝四个方向行走一格,且开始处于水属性,位于空地的道具拾取后只能在该处立即使用(或者不使用),且可以多次使用。求它走出迷宫需要的最少时间。
输入描述:
第一行两个正整数 n, m 表示迷宫的大小。 接下来 n 行,每行长度为 m 的字符串。描述地图。 其中 'S' 表示起点,'T' 表示终点,'.' 表示空地,'w'表示岩浆,'~'表示水池,'@' 表示道具,'#'表示障碍。 保证地图中的起点和终点只有一个,道具都位于空地。
输出描述:
输出一个整数,表示 Applese 走出迷宫的最短时间。特别地,如果 Applese 走不出迷宫,输出 "-1"。
示例1
输入
5 5 .w@.. .S#.. ~w#.. .w..~ @w.~T
输出
18
备注:
1≤n,m≤100
除了坐标之外还多了一个关于水属性,火属性的状态,然后就是模板一样的bfs(。)
不多港了
#include <iostream>
#include <queue>
using namespace std;
char a[110][110]={0};
bool flag[110][110][2]={0};//坐标,状态
int b[4]={1,0,-1,0};
int d[4]={0,1,0,-1};
struct st{
int x,y,step;
bool h;
st(int a,int b,int c,bool d):x(a),y(b),step(c),h(d){};
};
int main()
{
ios::sync_with_stdio(false);
int n,m,i,j;
cin>>n>>m;
int sx,sy,ex,ey;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='S'){
sx=i;
sy=j;
}
if(a[i][j]=='T'){
ex=i;
ey=j;
}
}
}
//'S' 表示起点,'T' 表示终点,'.' 表示空地,'w'表示岩浆,'~'表示水池,'@' 表示道具,'#'表示障碍。
queue <st> qe;
qe.push(st(sx,sy,0,1));//1水,0 火
flag[sx][sy][1]=1;
bool f=1;
while(!qe.empty()){
st t=qe.front();
qe.pop();
if(t.x==ex&&t.y==ey){
cout<<t.step<<endl;
f=0;
break;
}
if(a[t.x][t.y]!='#'){
for(i=0;i<4;i++){
int x=t.x+b[i],y=t.y+d[i];
if(flag[x][y][t.h]) continue;
if(x<=n&&x>0&&y>0&&y<=m){
if(a[x][y]=='.'||a[x][y]=='S'||a[x][y]=='T'||a[x][y]=='@'){
flag[x][y][t.h]=1;
qe.push(st(x,y,t.step+1,t.h));
}
if(a[x][y]=='w'&&!t.h){
qe.push(st(x,y,t.step+1,t.h));
flag[x][y][t.h]=1;
}
if(a[x][y]=='~'&&t.h){
qe.push(st(x,y,t.step+1,t.h));
flag[x][y][t.h]=1;
}
}
}
}
if(a[t.x][t.y]=='@'){
if(!flag[t.x][t.y][!t.h]){
qe.push(st(t.x,t.y,t.step+1,!t.h));
flag[t.x][t.y][!t.h]=1;
}
}
}
if(f){
cout<<"-1"<<endl;
}
return 0;
}