Java算法题--坐标题找目标(下次再见到你,我肯定要AC!)

大致意思是:一个人从(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;
		}
	}
}

前端算法踩坑之路~~~~,任重而道远~~~~~~

你可能感兴趣的:(算法训练)