不用循环队列会T
#include<bits/stdc++.h>
using namespace std;
const int N=1000;
const int M=1e6+100;
char g[N][N];
struct P{
int x,y,t;
};
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int n,k;
bool st[N][N];
P q[M];
int hh,tt;
bool check(int x,int y,int shike){
int m=2;
if(shike>=k&&shike<2*k) m=1;
else if(shike>=2*k) m=0;
if(x-m<1||x+m>n||y-m<1||y+m>n) return false;
for(int i=x-m;i<=x+m;i++){
for(int j=y-m;j<=y+m;j++){
if(g[i][j]=='*') return false;
}
}
return true;
}
int bfs(){
//queue<P> q;
P u={3,3,0};
//q.push(u);
q[tt++]=u;
if(tt==M) tt=0;
st[3][3]=1;
while(hh!=tt){
//u=q.front();
u=q[hh++];
if(hh==M) hh=0;
//q.pop();
P e={u.x,u.y,u.t+1};
//q.push(e);
q[tt++]=e;
if(tt==M) tt=0;
for(int i=0;i<4;i++){
int x=u.x+dx[i];
int y=u.y+dy[i];
if(st[x][y]) continue;
if(!check(x,y,u.t)) continue;
if(x==n-2&&y==n-2) return u.t+1;
P b={x,y,u.t+1};
//q.push(b);
q[tt++]=b;
if(tt==M) tt=0;
st[x][y]=1;
}
}
return -1;
}
int main(){
cin>>n>>k;
//scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
cin>>g[i]+1;
//scanf("%s",g[i]+1);
}
int ans=bfs();
printf("%d\n",ans);
return 0;
}