http://pipioj.online/problem.php?id=1470
思路:
s
t
e
p
x
y
k
step_{xyk}
stepxyk表示从起点
S
S
S出发到
(
x
,
y
)
(x,y)
(x,y)还能使用
k
k
k次遁地时所需要的最少步数,
b
f
s
bfs
bfs保证按照最少次数扩展,简单搜索题。舍友非得追着我问为啥标记数组是三维的,二维的怎么不对呢?唉,没理解搜索的本质啊,二维的少了一维状态,简单来说没用遁地到达
(
x
,
y
)
(x,y)
(x,y)和用了遁地到达
(
x
,
y
)
(x,y)
(x,y)完全是两个不同的状态,不能一概而论啊。附上一个检验用的样例:
3 5 1
S....
####.
T###.
正解是5,如果得到的结果是-1的话就要好好思考思考了。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=505;
struct node
{
int x,y,ck;
node(int x=0,int y=0,int c=0):x(x),y(y),ck(c){}
};
int n,m,k;
char s[maxn][maxn];
int step[maxn][maxn][11];
int d[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
inline int bfs(int sx,int sy,int tx,int ty)
{
memset(step,-1,sizeof(step));
queue<node> q;
step[sx][sy][k]=0;
q.emplace(sx,sy,k);
while(!q.empty())
{
node f=q.front();
q.pop();
int dx,dy;
for(int i=0;i<4;i++)
{
dx=f.x+d[i][0];
dy=f.y+d[i][1];
if(dx>=0&&dx<n&&dy>=0&&dy<m&&s[dx][dy]!='#'&&step[dx][dy][f.ck]==-1)
{
step[dx][dy][f.ck]=step[f.x][f.y][f.ck]+1;
if(dx==tx&&dy==ty)
return step[dx][dy][f.ck];
q.emplace(dx,dy,f.ck);
}
}
if(f.ck)
{
dx=n-1-f.x;
dy=m-1-f.y;
if(s[dx][dy]!='#'&&step[dx][dy][f.ck-1]==-1)
{
step[dx][dy][f.ck-1]=step[f.x][f.y][f.ck]+1;
if(dx==tx&&dy==ty)
return step[dx][dy][f.ck-1];
q.emplace(dx,dy,f.ck-1);
}
}
}
return -1;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++)
scanf("%s",s[i]);
int sx,sy,tx,ty;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(s[i][j]=='S')
sx=i,sy=j;
else if(s[i][j]=='T')
tx=i,ty=j;
}
}
printf("%d\n",bfs(sx,sy,tx,ty));
return 0;
}