这道题我记得是今年暑假集训的时候做过的,当时搞了好久都搞不出来,其实这道题用DFS思路更简单,但是我就是比较喜欢用BFS,但是BFS要做好路径的回溯,否则很容易漏掉最短时长,作为ZSTU的amcer,大家要加油额。
其实做搜索题时,往往DFS和BFS都是可以的,区别在时间和空间的复杂度不同,所以碰到搜索题,最好两种方法都写一遍,这样对下次碰到类似题就知道BFS和DFS对于该题的优劣了。
这是AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
int n,m,xx,yy,xi,yi;
const int INF=10000000;
char map[55][55];
int vis[55][55],sum[55][55];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
struct node
{
int x,y;
};
void bfs()
{
queue<node> qq;
node p;
p.x=xx;
p.y=yy;
qq.push(p);
sum[xx][yy]=0;
vis[xx][yy]=1;
while(!qq.empty())
{
node q;
q=qq.front();
qq.pop();
vis[q.x][q.y]=0;
for(int i=0;i<4;i++)
{
int x=q.x+dir[i][0];
int y=q.y+dir[i][1];
if(map[x][y]=='#'||x<0||y<0||x>=n||y>=m)
continue;
int add;
if(map[x][y]=='x')
{
add=2;
}
else if(map[x][y]=='X')
{
add=3;
}
else
{
add=1;
}
if(sum[q.x][q.y]+add<sum[x][y]){
sum[x][y]=sum[q.x][q.y]+add;
if(!vis[x][y])
{
node w;
w.x=x;
w.y=y;
qq.push(w);
vis[x][y]=1;
}
}
}
}
if(sum[xi][yi]==INF)
printf("-1\n");
else
printf("%d\n",sum[xi][yi]);
}
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",map[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(map[i][j]=='p')
{
xx=i;
yy=j;
}
else if(map[i][j]=='g')
{
xi=i;
yi=j;
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
sum[i][j]=INF;
memset(vis,0,sizeof(vis));
bfs();
}
}