题目描述
蒙蒙要找对象啦!但是对象在和他玩捉迷藏,现在有一个55的地图,蒙蒙就在(0,0)的位置,他的心上人就在(4,4)的位置,当然路上会有各种艰难险阻,现在说明一下规则。蒙蒙按照地图行动,一次走一步,而且他只能前后左右的移动,当然蒙蒙也不能穿越墙壁。地图上有两种图案,一种是‘0’表示可以走的路,另一种是‘1’表示不能走的墙
PS:(0,0)就是左上角,(4,4)就是右下角,都懂吧!
输入
输入一个55的矩阵表示地图,‘0’表示可以走的路,‘1’表示不能走的墙,蒙蒙就在(0,0)的位置,他的心上人就在(4,4)的位置
输出
输出蒙蒙到心上人那里最少要走多少步,若蒙蒙永远走不到心上人那里,则输出-1
样例输入
0 1 0 0 0
0 0 0 1 0
0 1 0 1 0
0 1 0 0 0
0 0 0 1 0
样例输出
8
package com.vector.test;
import java.util.Scanner;
//深搜递归状态压缩
public class Main {
//定义地图终点
static final int F = 5;
//初始化min可以遍历的最大值 5*5
static int min = 25;
//定义包含墙的地图
static int[][] a = new int[7][7];
static int[][] flag = new int[7][7];
//定义试探坐标.本算法是标准坐标旋转90°,从右开始按顺时针试探.
static int[] dx = {0, -1, 0, 1};
static int[] dy = {1, 0, -1, 0};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//初始化墙,避免试探,指针越界
for (int i = 0; i <= 6; i++) {
a[0][i] = 1;
a[i][0] = 1;
a[6][i] = 1;
a[i][6] = 1;
}
//输入地图
for (int i = 1; i < 6; i++) {
for (int j = 1; j < 6; j++) {
a[i][j] = sc.nextInt();
}
}
//定义开始起点
int startx = 1, starty = 1;
//标记走过的
flag[startx][starty] = 1;
//开始dfs搜索
DFS(startx, starty, 0);
//如果全图搜索,没有到达终点返回-1,否则返回最小步长
System.out.println(min==25?-1:min);
}
public static void DFS(int x, int y, int step) {
//定义终点情况
if (x == F && y == F) {
if (step < min) min = step;
return;
}
定义试探坐标.本算法是标准坐标旋转90°,从右开始按顺时针试探.
for (int k = 0; k < 4; k++) {
int tx, ty;
tx = x + dx[k];
ty = y + dy[k];
//试探方向,试探未访问的点
if (a[tx][ty] == 0 && flag[tx][ty] == 0) {
//试探完毕,标记当前坐标,证明走过.
flag[tx][ty] = 1;
DFS(tx, ty, step + 1);
//回溯,恢复原标记,重新试探
flag[tx][ty] = 0;
}
}
}
}