#include <bits/stdc++.h>
#define maxn 1010
char mp[maxn][maxn];
int mpf[maxn][maxn],ans[maxn][maxn],visf[maxn][maxn],visp[maxn][maxn];
int n,m,q,r,c;
int dr[]={0,0,-1,1},dc[]={-1,1,0,0};
using namespace std;
struct node{//定义点
int r,c;
};
bool checkf(int r,int c){//检查点的合法性
return r>0&&c>0&&r<=n&&c<=m&&mp[r][c]!='#'&&mp[r][c]!='F'&&!visf[r][c];
}
bool checkp(int r,int c){//检查点的合法性
return r>0&&c>0&&r<=n&&c<=m&&mp[r][c]!='#'&&mp[r][c]!='F'&&!visp[r][c];
}
bool ok(int r,int c){//检查是否到边界
return r==1||r==n||r==1||r==m;
}
void pre(queue<node> fi,int cot){//预处理,用火进行bfs
if(!fi.size())return;
queue<node> nex;
while(fi.size()){
auto it=fi.front();
fi.pop();
int r=it.r,c=it.c;
visf[it.r][it.c]=1;
for(int i=0;i<4;i++){
int rr=r+dr[i],cc=c+dc[i];
if(checkf(rr,cc)){
nex.push({rr,cc});
mpf[rr][cc]=cot+1;
visf[rr][cc]=1;
}
}
}
pre(nex,cot+1);
}
void bfs(queue<node> tp,int cot){//对边界进行bfs
if(!tp.size())return;
queue <node> nex;
while(tp.size()){
auto it=tp.front();
tp.pop();
int r=it.r,c=it.c;
for(int i=0;i<4;i++){
int rr=r+dr[i],cc=c+dc[i];
if(checkp(rr,cc)&&mpf[rr][cc]<=mpf[r][c]){
nex.push({rr,cc});
ans[rr][cc]=cot+1;
visp[rr][cc]=1;
}
}
}
bfs(nex,cot+1);
}
int main(){
cin>>n>>m>>q;
queue<node> fire;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
if(mp[i][j]=='F'){
fire.push({i,j});
mpf[i][j]=maxn;
}
}
}
pre(fire,0);//预处理
queue<node> tp;
for(int i=1;i<=n;i++){//将边界加入一个队列中好用来bfs
if(mp[i][1]!='F'&&mp[i][1]!='#'){
tp.push({i,1});
visp[i][1]=1;
}
if(mp[i][m]!='F'&&mp[i][m]!='#'){
tp.push({i,m});
visp[i][m]=1;
}
}
for(int i=1;i<=m;i++){
if(mp[1][i]!='F'&&mp[1][i]!='#'){
tp.push({1,i});
visp[1][i]=1;
}
if(mp[n][i]!='F'&&mp[n][1]!='#'){
tp.push({n,i});
visp[n][i]=1;
}
}
bfs(tp,1); //将边界bfs
while(q--){
cin>>r>>c;
cout<<ans[r][c]-1<<endl;
}
}
10-02
495
09-19
2666
10-07
1075
10-04
1584
10-03
1154
10-05
342