编程语言:Java
题目链接:http://poj.org/problem?id=3009
题解:移动距离可变的DFS
结果:AC
import java.io.*;
import java.util.Scanner;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static Scanner sc = new Scanner(System.in);
static int w, h;
static int[] dx = {0, 0, 1, -1};
static int[] dy = {1, -1, 0, 0};
static int[][] a;
static int res;
public static void main(String[] args) throws IOException {
for (; ; ) {
w = sc.nextInt();
h = sc.nextInt();
if (w == 0 && h == 0) break;
a = new int[h][w];
int x = 0, y = 0;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
a[i][j] = sc.nextInt();
if (a[i][j] == 2) {
x = i;
y = j;
}
}
}
res = Integer.MAX_VALUE;
//将初始位置置为0
a[x][y] = 0;
dfs(x, y, 0);
out.println(res == Integer.MAX_VALUE ? -1 : res);
out.flush();
}
}
private static void dfs(int x, int y, int step) {
if (step >= 10 || step >= res) return;
for (int i = 0; i < 4; i++) {
int sum = 0;
int tx = x + dx[i];
int ty = y + dy[i];
while (tx > -1 && tx < h && ty > -1 && ty < w && a[tx][ty] == 0) {
tx += dx[i];
ty += dy[i];
sum++;
}
if (tx < 0 || tx >= h || ty < 0 || ty >= w) continue;
//有可能在中途就遇到了终点,所以不能在下一次dfs的时候去判断
if (a[tx][ty] == 3) {
res = Math.min(res, step + 1);
return;
} else if (sum != 0) {
a[tx][ty] = 0;
dfs(tx - dx[i], ty - dy[i], step + 1);
a[tx][ty] = 1;
}
}
}
}