题目:
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define MAX 2005
char a[MAX][MAX];
int x,y,n,m,dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
bool vis[MAX][MAX][2];
struct Point
{
int x2,y2,k2,step2;
Point() {}
Point(int x,int y,int k,int step):x2(x),y2(y),k2(k),step2(step){}
}point;
int bfs(int x,int y,int k,int step)
{
queue<Point> q;
point = Point(x,y,k,step);
q.push(point);
while(!q.empty()){
point = q.front();
q.pop();
if(point.k2 == 1 && a[point.x2][point.y2] == 'T') return point.step2;
for(int i = 0;i < 4;i++){
int tx = point.x2 + dir[i][0];
int ty = point.y2 + dir[i][1];
if(!vis[tx][ty][point.k2] && a[tx][ty] != '#' && tx >= 0 && tx < n && ty >= 0 && ty < m){
vis[tx][ty][point.k2] = true;
if(a[tx][ty] == 'P') q.push(Point(tx,ty,1,point.step2 + 1));
else q.push(Point(tx,ty,point.k2,point.step2 + 1));
}
}
}
}
int main()
{
cin >> n >> m;
for(int i = 0;i < n;i++) cin >> a[i];
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
if(a[i][j] == 'S') x = i,y = j;
}
}
cout << bfs(x,y,0,0) << endl;
return 0;
}
这道题基本题意就是从所在位置拿到钥匙后走到家里的最小步数,那么可以把整个过程看成2部分,第一部分时起始位置走到钥匙的位置,第二部分是拿到钥匙走到家里。所以这里判重用的数组是三维的,前两个维度代表位置,第三个维度代表是否拿到钥匙,没拿到为0,拿到为1.接下来用bfs就可以,注意这里bfs终止条件有两个,第一个是到达家里的位置,第二个是k值是1,代表已经拿到钥匙。否则就算到达家,没有钥匙也是不行的。