大致意思是:一个人从(0,0)出发,到目标结点(x,y),坐标图上有n个障碍物,问到达目标节点至少需要走几步,一定会有结果。
输入:
第一行:x y n
接下来n行表示障碍物坐标
输出:结果
例如输入:
2 0 3
1 1
1 0
1 -1
输出:
6
Java:
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
public class Main {
static Map map = new HashMap();
static int x = 0;
static int y = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
x = sc.nextInt();
y = sc.nextInt();
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
map.put(sc.nextInt()+" "+sc.nextInt(), Integer.MAX_VALUE);
}
map.put(0+" "+0, 0);
HashSet m = new HashSet();
m.add(-1+" "+0);
m.add(1+" "+0);
m.add(0+" "+-1);
m.add(0+" "+1);
ff(m);
}
private static void ff(HashSet m) {
HashSet mm = new HashSet();
boolean boo = true;
for (String key : m) {
String str[] = key.split(" ");
int a = Integer.valueOf(str[0]);
int b = Integer.valueOf(str[1]);
int back = f(a,b);
if(back==0) {
boo = false;
break;
}else if(back==1) {
mm.add(a-1+" "+b);
mm.add(a+1+" "+b);
mm.add(a+" "+(b-1));
mm.add(a+" "+(b+1));
}else {
continue;
}
}
if(boo) ff(mm);
}
private static int f(int i, int j) {
if(map.containsKey(i+" "+j)) return -1;
int left = map.containsKey(i-1+" "+j)?map.get(i-1+" "+j):Integer.MAX_VALUE;
int right = map.containsKey(i+1+" "+j)?map.get(i+1+" "+j):Integer.MAX_VALUE;
int top = map.containsKey(i+" "+(j-1))?map.get(i+" "+(j-1)):Integer.MAX_VALUE;
int bottom = map.containsKey(i+" "+(j+1))?map.get(i+" "+(j+1)):Integer.MAX_VALUE;
int fif = Math.min(Math.min(left, right), Math.min(top, bottom))+1;
if(i==x && j==y) {
System.out.println(fif);
return 0;
}else {
map.put(i+" "+j, fif);
return 1;
}
}
}
前端算法踩坑之路~~~~,任重而道远~~~~~~