题目
思路
利用2次bfs求出每个点最早到达时间和扩展半径,然后用一个优先队列套BFS求答案
code:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
inline long long read()
{
long long ret,c,f=1;
while (((c=getchar())> '9'||c< '0')&&c!='-');
if (c=='-') f=-1,ret=0;
else ret=c-'0';
while ((c=getchar())>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+(c^48);
return ret*f;
}
struct f{
long long x,y,ti;
} pp,p3;
bool operator <(const f &a,const f &b)
{
return a.ti<b.ti;
}
long long n,d,u,po[1005][1005],ti[1005][1005],ans,q[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
bool book[1005][1005],vis[1005][1005];
pair<long long,long long> p,p2;
queue<pair<long long,long long> > b;
queue<f> a;
priority_queue<f> c;
char x[1005][1005];
int main()
{
memset(book,0,sizeof(book));
memset(ti,-1,sizeof(ti));
n=read(),d=read();
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
cin>>x[i][j];
if (x[i][j]=='S')
{
pp.x=i,pp.y=j,pp.ti=0;
a.push(pp);
ti[i][j]=1;
}
if (x[i][j]=='#')
{
p.first=i,p.second=j;
b.push(p);
book[i][j]=1;
}
}
}
while (b.size())
{
p=b.front();
b.pop();
for (int i=0;i<4;i++)
{
int dx=p.first+q[i][0],dy=p.second+q[i][1];
if (dx<1||dy<1||dx>n||dy>n||x[dx][dy]=='#'||book[dx][dy]) continue;
po[dx][dy]=po[p.first][p.second]+1;
book[dx][dy]=1;
p2.first=dx,p2.second=dy;
b.push(p2);
}
}
memset(book,0,sizeof(book));
while (a.size())
{
pp=a.front();
a.pop();
if (pp.ti/d>=po[pp.x][pp.y])
{
vis[pp.x][pp.y]=1;
continue;
}
for (int i=0;i<4;i++)
{
int dx=pp.x+q[i][0],dy=pp.y+q[i][1];
if (dx<1||dy<1||dx>n||dy>n||x[dx][dy]=='#'||ti[dx][dy]!=-1||po[dx][dy]-1<pp.ti/d) continue;
ti[dx][dy]=pp.ti+1;
p3.x=dx,p3.y=dy,p3.ti=pp.ti+1;
a.push(p3);
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
if (ti[i][j]!=-1)
{
ti[i][j]/=d;
ti[i][j]-=vis[i][j];
pp.x=i,pp.y=j,pp.ti=ti[i][j];
c.push(pp);
book[i][j]=1;
ans++;
}
}
}
while (c.size())
{
pp=c.top();
c.pop();
if (pp.ti==0) continue;
for (int i=0;i<4;i++)
{
int dx=pp.x+q[i][0],dy=pp.y+q[i][1];
if (dx<1||dy<1||dx>n||dy>n||x[dx][dy]=='#'||book[dx][dy]) continue;
book[dx][dy]=1;
ans++;
p3.x=dx,p3.y=dy,p3.ti=pp.ti-1;
c.push(p3);
}
}
cout<<ans;
return 0;
}