import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.Deque;
//http://lx.lanqiao.cn/problem.page?gpid=T2738
//https://www.lanqiao.cn/problems/234/learning/
public class Main {
static int[]dx=new int[]{0,0,1,-1};
static int[]dy=new int[]{1,-1,0,0};
public static void main(String[] args) throws IOException {
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
PrintWriter out=new PrintWriter(new BufferedOutputStream(System.out));
String[]strings=in.readLine().split(" ");
int n=Integer.parseInt(strings[0]);
int k=Integer.parseInt(strings[1]);
char[][]arr=new char[n][n];
for (int i = 0; i < n; ++i) {
arr[i]=in.readLine().toCharArray();
}
boolean[][]visited=new boolean[n][n];
Deque<int[]>queue=new ArrayDeque<>();
queue.add(new int[]{2,2,2});
int time=0;
int R=2;
while (!queue.isEmpty()){
++time;
int size=queue.size();
if (time==k){
R--;
}else if (time==2*k){
R--;
}
while (size-->0){
int[]temp=queue.remove();
int x=temp[0];
int y=temp[1];
int r=temp[2];
if (x==n-3&&y==n-3){
out.println(time-1);
queue.clear();
break;
}
if (r>0){
queue.offer(new int[]{x,y,R});
}
for (int i = 0; i < 4; ++i) {
int newX=x+dx[i];
int newY=y+dy[i];
boolean flag=true;
outloop:
for (int j = newX-r; j <= newX+r; ++j) {
for (int l = newY-r; l <=newY+r ; ++l) {
if (j<0||j>=n||l<0||l>=n||arr[j][l]=='*'||visited[newX][newY]){
flag=false;
break outloop;
}
}
}
if (flag){
queue.add(new int[]{newX,newY,R});
//out.println("x:"+newX+" y:"+newY+" R:"+R);
visited[newX][newY]=true;
}
}
}
}
in.close();
out.close();
}
}
可以得全分。有不懂的地方评论提问吧,不想写注释了,应该容易理解,套BFS模板然后根据题目要求改。
题目