把fill换成memset后跑得飞快:
#include <bits/stdc++.h>
#define ll int
using namespace std;
ll an[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
bool vis[505][505];
char a[505][505];
queue<pair<ll,ll>> qp;
pair<ll,ll> pl;
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
ll n,m,q,x,y;
cin >> n >> m;
for (ll i=1; i<=n; i++) {
for (ll j=1;j<=m;j++)
cin >> a[i][j];
}
cin >> q;
for (ll i=0; i<q; i++) {
ll ans=0x3f3f3f;
cin >> x >> y;
if(a[x][y]=='x'){
cout<<0<<endl;
continue;
}
for (ll j=0; j<=n; j++)
fill(vis[j],vis[j]+m+1,0);
qp.push(make_pair(x,y));
vis[x][y]=1;
while (!qp.empty()) {
pl=qp.front();
qp.pop();
for (ll j=0; j<4; j++) {
ll px=pl.first+an[j][0],py=pl.second+an[j][1];
if((px-x)*(px-x)+(py-y)*(py-y)>=ans)continue;
if(px<=n&&px>=1&&py<=m&&py>=1&&!vis[px][py]) {
if (a[px][py]=='x') {
ans=min(ans,(px-x)*(px-x)+(py-y)*(py-y));
}
qp.push(make_pair(px,py));
vis[px][py]=1;
}
}
}
while (!qp.empty())qp.pop();
cout << ans << endl;
a[x][y]='x';
}
return 0;
}