阿里巴巴实习模拟笔试题:有一个n行n列的方阵,对应每个位置上有一个升降杆,只能平移或下滑,升降杆提升速度是每1单位时间,计算出这个最短时间

 在一个巨大的水池内,有一个n行n列的方阵,对应每个位置上有一个升降杆,参赛者可以在升降杆之间移动;在开始时刻每个升降杆的高度不同,但是具体是多少高度会显示出来,每个升降杆都有开关让参赛者控制升降杆移动。
现要求参赛选手以最短的等待时间从(0,0)到达(n-1,n-1)。在升降杆之间移动时可以选择相邻的上、下、左、右四个方向的升降杆,但是只能平移或下滑,即在高度相同的两个升降杆之间移动或从高处移到低处,如果一个升降杆的高度比其他四个方向上的升降杆的低,则必须等待升降杆提升至高度于其他相邻任意之一相同时才能移动,升降杆提升速度是每1单位时间能升高1单位高度。
请帮主持人设计一个程序计算出这个最短时间,用以判断每个选手是否过关。
举例如下:
Input: [[0,5],[6,3]]
Output: 5
解释,升降杆的分布及其高度如下所示:
0 5
6 3
开始在(0,0),你不能去其他其他升降杆,因为相邻的升降杆的高度都大于0,你等待升降杆提升到相同高度时才能移动,从高处到低处不需要等待。
(0,0) ->(0,1) ->(1,1)需要等待5个单位时间
(0,0)-> (1,0) ->(1,1)需要等待6个单位时间
所以输出最小时间是5,如果参赛者大于这个时间就失败了。
Input: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]
Output: 16
解释,升降杆的分布及其高度如下所示:
0  1    2    3    4
24  23 22  21    5
12 13  14  15 16
11 17  18  19 20
10  9    8    7  6
加黑的是经过的路线,时间最少。从高处到低处不需要等待。
(0,0)->(4,4)需要等待16个单位时间
所以输出最小时间是16,如果参赛者大于这个时间就失败了。
16-牛可  19:44:45
Input: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]
Output: 16
解释,升降杆的分布及其高度如下所示:
0  1    2    3    4
24  23 22  21    5
12 13  14  15 16
11 17  18  19 20
10  9    8    7  6
加黑的是经过的路线,时间最少。从高处到低处不需要等待。
(0,0)->(4,4)需要等待16个单位时间
所以输出最小时间是16,如果参赛者大于这个时间就失败了。

//data[][]表示地图,time []][]表示从起点到地图上任何一个点的时间花费

private static void getShortestWayInMap(int[][] data) {

		int[][] time = new int[data.length][data[0].length];


		for (int i = 1; i < time.length; i++) {
			time[i][0] = time[i - 1][0];
			if (data[i - 1][0] < data[i][0]) {
				time[i][0] += data[i][0] - data[i - 1][0];
			}
		}
		for (int i = 0; i < time.length; i++) {
			for (int j = 1; j < time[i].length; j++) {
				time[i][j] = time[i][j - 1];
				if (data[i][j - 1] < data[i][j]) {
					time[i][j] += data[i][j] - data[i][j - 1];
				}
			}
		}


		work(data, time);
		work(data, time);
		work(data, time);
		// for (int i = 0; i < time.length; i++) {
		// System.out.println(Arrays.toString(data[i]));
		// }
		// System.out.println("");
		// for (int i = 0; i < time.length; i++) {
		// System.out.println(Arrays.toString(time[i]));
		// }
	}


	private static void work(int[][] data, int[][] time) {


		for (int i = 1; i < time.length; i++) {
			for (int j = 0; j < time[i].length; j++) {
				int tmp = time[i - 1][j];
				if (data[i - 1][j] < data[i][j]) {
					tmp += data[i][j] - data[i - 1][j];
				}
				if (time[i][j] > tmp) {
					time[i][j] = tmp;
				}
			}
		}


		for (int i = 0; i < time.length; i++) {
			for (int j = 1; j < time[i].length; j++) {
				int tmp = time[i][j - 1];
				if (data[i][j - 1] < data[i][j]) {
					tmp += data[i][j] - data[i][j - 1];
				}
				if (time[i][j] > tmp) {
					time[i][j] = tmp;
				}
			}
		}


		for (int i = time.length - 2; i >= 0; i--) {
			for (int j = 0; j < time[i].length; j++) {
				int tmp = time[i + 1][j];
				if (data[i][j] > data[i + 1][j]) {
					tmp += data[i][j] - data[i + 1][j];
				}
				if (time[i][j] > tmp) {
					time[i][j] = tmp;
				}
			}
		}


		for (int i = 0; i < time.length; i++) {
			for (int j = time[i].length - 2; j >= 0; j--) {
				int tmp = time[i][j + 1];
				if (data[i][j + 1] < data[i][j]) {
					tmp += data[i][j] - data[i][j + 1];
				}
				if (time[i][j] > tmp) {
					time[i][j] = tmp;
				}
			}
		}


	}

猜你喜欢

转载自blog.csdn.net/qq_39559604/article/details/80232280