昨天没读懂题写了半天,,,
题意:每个人每次可扩张的点是从当前占据点开始走s[ i ] 步可到达的所有点,每轮每个人依次扩张,问你最后每个人占据的格子有多少
(1)多个起点,多源BFS
(2)每次扩张的时候肯定从最外围(即上一次扩张走的剩余步数为0的点),所以我们对每个点除了坐标之外还要存下该点还能走几步
int n,m,p,s[11],ans[11];
char mp[1111][1111];
queue<pair<pii,int> >q[11];
vector<pair<int,int> >tmp;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
void bfs()
{
while(1)
{
int flag=0;
rpp(i,p)//依次进行bfs
{
tmp.clear();
while(q[i].size())
{
auto x=q[i].front();q[i].pop();
if(x.second==0)
tmp.push_back(make_pair(x.first.first,x.first.second));
else
{
rep(k,4)
{
int nx=x.first.first+dx[k],ny=x.first.second+dy[k];
if(nx<1||ny<1||nx>n||ny>m||mp[nx][ny]!='.') continue;
mp[nx][ny]=i+'0';
q[i].push(make_pair(make_pair(nx,ny),x.second-1));
flag=1;
}
}
}
for(auto x:tmp) q[i].push(make_pair(x,s[i]));
}
if(flag==0) break;//没有点可以走了,跳出循环
}
}
void solve()
{
cin>>n>>m>>p;
rpp(i,p) cin>>s[i];
rpp(i,n)
{
scanf("%s",mp[i]+1);
rpp(j,m)
if(isdigit(mp[i][j]))
q[mp[i][j]-'0'].push(make_pair(make_pair(i,j),s[mp[i][j]-'0']));
}
bfs();
rpp(i,n) rpp(j,m) if(isdigit(mp[i][j])) ++ans[mp[i][j]-'0'];
rpp(i,p) cout<<ans[i]<<" ";
cout<<endl;
}