蒜头君得到一张藏宝图。藏宝图是一个 1010×10 的方格地图,图上一共有 1010 个宝藏。有些方格地形太凶险,不能进入。
整个图只有一个地方可以出入,即是入口也是出口。蒜头君是一个贪心的人,他规划要获得所有宝藏以后才从出口离开。
藏宝图上从一个方格到相邻的上下左右的方格需要 11 天的时间,蒜头君从入口出发,找到所有宝藏以后,回到出口,最少需要多少天。
import java.util.Iterator; import java.util.Scanner; import java.util.Set; import java.util.TreeSet; public class Main { static double a; static double b; static int count; static char[][] map = new char[10][10]; static int[][] book = new int[10][10]; static Set<Integer> set = new TreeSet<Integer>(); public static void main(String[] args) { Scanner sc = new Scanner(System.in); for(int i = 0; i < map.length; i ++) { for(int j = 0; j < map[i].length; j ++) { map[i][j] = sc.next().charAt(0); } } a = System.currentTimeMillis(); dfs(0, 0, 0, 0); Iterator<Integer> iterator = set.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } } private static void dfs(int x, int y, int days, int bao) { b = System.currentTimeMillis(); if(b - a > 60000) return; int[] xx = {-1, 0, 1, 0}; int[] yy = {0, 1, 0, -1}; if(bao == 10) { set.add(days + 1000 * x + 100 * y); return; } if(days > 50) return; for(int i = 0; i < 4; i ++) { if(book[x][y] == 0 && x + xx[i] >= 0 && x + xx[i] < 10 && y + yy[i] >= 0 && y + yy[i] < 10 && map[x + xx[i]][y + yy[i]] != 'X') { if(map[x + xx[i]][y + yy[i]] == '#') { book[x][y] = 1; dfs(x + xx[i], y + yy[i], days + 1, bao + 1); book[x][y] = 0; } else { book[x][y] = 1; dfs(x + xx[i], y + yy[i], days + 1, bao); book[x][y] = 0; } } } } }