1. 场景
2. 实现主要原理
从一个给定的点开始进行顺时针遍历(右下左上),这个过程一直递归直到全部都return为止。下面是遍历的时候注意的地方:
1 使用递归方式求解:先判断当前点是否为终点,非终点时递归调用DFS
2 调用DFS前当前点标记为已访问,DFS执行结束后当前点标记为未访问:前者防止递归调用时重复访问当前点走回头路,后者是为探索其他路径时能重复访问该点。
3 使用外部变量统计最小步数
3. 代码实现
import java.util.Scanner;
public class Test4 {
private int m,n,p,q;
private int min=99999999;
private int[][] a = new int[100][100]; //1表示空地,2表示障碍物
private int[][] v = new int[100][100]; //0表示未访问,1表示访问
private int[] dx= {0,1,0,-1};
private int[] dy={1,0,-1,0};
public void dfs(int x, int y, int step){
if (x == p && y==q){
if (step < min){
min = step;
}
return;
}
for (int k = 0; k <= 3; k++){
int tx,ty;
tx = x+dx[k];
ty = y+dy[k];
if (a[tx][ty] == 1 && v[tx][ty] == 0){
v[tx][ty] = 1;
dfs(tx,ty,step+1);
v[tx][ty] = 0;
}
}
return;
}
/**
* @param args
*/
public static void main(String[] args) {
int startx,starty;
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
Test4 test4 =new Test4();
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
test4.a[i][j] = sc.nextInt(); //1表示空地,2表示障碍物
startx = sc.nextInt();
starty = sc.nextInt();
test4.p = sc.nextInt();
test4.q = sc.nextInt();
test4.v[startx][starty] = 1;
test4.dfs(startx,starty,0);
System.out.println("最小值是"+test4.min);
}
}
输入数字:
5 4 1 1 2 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 2 1 1 4 3
可表示为:
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
输出结果: