题意:问你能否从R走到T,如果能,就算最小的步数
解法:BFS+记忆化搜索,设置一个数组存下当前位置的最小步数,最后返dp[x][y],x y为T的坐标即可
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
using namespace std;
int dir[4][2] = {-1,0,0,1,1,0,0,-1};
struct point
{
int x;
int y;
int step;
};
queue<point>Q;
int N,M;
char ma[309][309];
int vis[309][309];
int mintime[309][309];
int sx,sy,dx,dy;
int flag;
int BFS(point x)
{
while(!Q.empty()) Q.pop();
Q.push(x);
point hd;
while(!Q.empty())
{
hd = Q.front();
Q.pop();
for(int i = 0; i<4; i++)
{
int xx = hd.x + dir[i][0];
int yy = hd.y + dir[i][1];
if(xx<0||xx>=N||yy<0||yy>=M) continue;
if(ma[xx][yy]!='S'&&ma[xx][yy]!='R')
{
point t;
t.x = xx;
t.y = yy;
t.step = hd.step + 1;
if(ma[xx][yy] == 'B')
t.step++;
if(t.step < mintime[xx][yy])
{
mintime[xx][yy] = t.step;
Q.push(t);
}
}
}
}
return mintime[dx][dy];
}
int main()
{
while(~scanf("%d%d",&N,&M))
{
if(N==0&&M==0)break;
memset(vis,0,sizeof(vis));
for(int i = 0; i<N; i++)
scanf("%s",ma[i]);
for(int i = 0; i<N; i++)
{
for(int j = 0; j<M; j++)
{
mintime[i][j] = INF;
if(ma[i][j] == 'Y')
{
sx = i;
sy = j;
}
if(ma[i][j] == 'T')
{
dx = i;
dy = j;
}
}
}
point start;
start.x = sx;
start.y = sy;
start.step = 0;
flag = 0;
mintime[sx][sy] = 0;
int ans = BFS(start);
if(ans<INF)
{
printf("%d\n",ans);
}
else
printf("-1\n");
}
return 0;
}