解题思路:
注意事项: 这个题和一般的迷宫问题不同在于可以呆在原地等待,vis[][]用于记录走过的位置,注意原地等待不用判断是否走过(因为一定已经走过)
参考代码:
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class 大胖子走迷宫 {
static int[] xx ={1,0,-1,0};
static int[] yy ={0,1,0,-1};
static boolean[][] vis;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
char[][] map = new char[n + 2][n + 2];
vis = new boolean[n + 2][n + 2];
for (int i = 1; i <= n; i++) {
String str = scanner.next();
for (int j = 1; j <= n; j++) {
map[i][j] = str.charAt(j - 1);
}
}
System.out.println(bfs(map,k,n));
}
public static int bfs(char[][]map,int k,int n){
Queue<int []> queue=new LinkedList<>();
queue.add(new int[]{3,3,0});
while (!queue.isEmpty()){
int[] now =queue.poll();
if(now[0]==n-2&&now[1]==n-2){
return now[2];
}
for(int i=0;i<=3;i++){
int dx=xx[i]+now[0];
int dy=yy[i]+now[1];
if(now[2]<k){
if(dx<=n-2&&dx>=3&&dy>=3&&dy<=n-2&&!vis[dx][dy]){
boolean can=true;
for(int j=dx-2;j<=dx+2;j++){
for(int p=dy-2;p<=dy+2;p++){
if(map[j][p]=='*')
{
can=false;
break;
}
}
}
if(can)
{
vis[dx][dy]=true;
queue.add(new int[]{dx,dy,now[2]+1});
}
}
}
else if(now[2]<2*k&&now[2]>=k){
if(dx<=n-1&&dx>=2&&dy>=2&&dy<=n-1&&!vis[dx][dy]){
boolean can=true;
for(int j=dx-1;j<=dx+1;j++){
for(int p=dy-1;p<=dy+1;p++){
if(map[j][p]=='*')
{
can=false;
break;
}
}
}
if(can)
{
vis[dx][dy]=true;
queue.add(new int[]{dx,dy,now[2]+1});
}
}
}
else {
if(dx<=n&&dx>=1&&dy>=1&&dy<=n&&!vis[dx][dy]){
if(map[dx][dy]!='*')
{
vis[dx][dy]=true;
queue.add(new int[]{dx,dy,now[2]+1});
}
}
}
}
queue.add(new int[]{now[0],now[1],now[2]+1}); //增加原地等待选项
}
return -1;
}
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复