1. 程式人生 > >阿里巴巴2019線上筆試(之一)

阿里巴巴2019線上筆試(之一)

光明小學的小朋友們要舉行一年一度的接力跑大賽了,但是小朋友們卻遇到了一個難題:設計接力跑大賽的線路,你能幫助他們完成這項工作麼?
光明小學可以抽象成一張有N個節點的圖,每兩點間都有一條道路相連。光明小學的每個班都有M個學生,所以你要為他們設計出一條恰好經過M條邊的路徑。
光明小學的小朋友們希望全盤考慮所有的因素,所以你需要把任意兩點間經過M條邊的最短路徑的距離輸出出來以供參考。

你需要設計這樣一個函式:
res[][] Solve( N, M, map[][]);
注意:map必然是N * N的二維陣列,且map[i][j] == map[j][i],map[i][i] == 0,-1e8 <= map[i][j] <= 1e8。(道路全部是無向邊,無自環)2 <= N <= 100, 2 <= M <= 1e6。

map陣列表示了一張稠密圖,其中任意兩個不同節點i,j間都有一條邊,邊的長度為map[i][j]。N表示其中的節點數。
你要返回的陣列也必然是一個N * N的二維陣列,表示從i出發走到j,經過M條邊的最短路徑
你的路徑中應考慮包含重複邊的情況。

樣例:

N = 3
M = 2
map = {
 {0, 2, 3},
 {2, 0, 1},
 {3, 1, 0}
}

輸出結果result為:
result = {
 {4, 4, 3},
 {4, 2, 5},
 {3, 5, 2}
}

輸入樣例:

3
2
3 3 
0 2 3
2 0 1
3 1 0

輸出樣例:

[[4, 4, 3],

[4, 2, 5],

[3, 5, 2]]

這是我在C下面用dfs寫的程式碼,沒用用剪枝,是一個非常暴力的dfs,看到網上有一個Python的答案是錯的,所以自己寫了一個,但是考的時候時間太短了沒寫完,是下來寫的。

這個測評對面試、筆試沒有任何影響,沒寫出來也沒關係,但是大家還是不要直接複製黏貼我的,萬一別人做個查重,你們所有人都複製黏貼我的會被發現的。

主要就是我不寫出來不開心,所以自己下來寫了。。。。。。。。。

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
 
/*
輸入樣例:
3
2
3 3 
0 2 3
2 0 1
3 1 0
輸出樣例:
[[4, 4, 3],
[4, 2, 5],
[3, 5, 2]]
*/
/** 請完成下面這個函式,實現題目要求的功能 **/
/** 當然,你也可以不按照這個模板來作答,完全按照自己的想法來 ^-^  **/
 
#define maxVal 100000
 
void dfs(const long N, const long M, const int target, long *maxDis, long** map, int step, int thisPoint, int nowDis)
{
	if (step == M)
	{
		if (thisPoint == target)
		{
			if (nowDis < *maxDis)
			{
				*maxDis = nowDis;
			}
		}
 
		return;
	}
 
	for (int nextPoint = 0; nextPoint < N; nextPoint++)
	{
		if (nextPoint != thisPoint)
		{
			dfs(N, M, target, maxDis, map, ++step, nextPoint, nowDis + map[thisPoint][nextPoint]);
			step--;
		}
	}
 
}
 
 
long** Solve(long N, long M, int map_size_row, int map_size_cols, long** map, int* result_size_rows, int* result_size_cols) {
	
	long** res = (long**)malloc(map_size_row*sizeof(long*));
	int _map_init_i = 0;
	for (_map_init_i = 0; _map_init_i < map_size_row; ++_map_init_i)
	{
		res[_map_init_i] = (long*)malloc(map_size_cols*(sizeof(long)));
	}
 
	for (int j = 0; j < map_size_cols; j ++)
		for (int i = j; i < map_size_row; i++)
		{
			long maxDis = maxVal;
			dfs(N, M, i, &maxDis, map, 0, j, 0);
			res[j][i] = maxDis;
			res[i][j] = maxDis;
		}
	*result_size_rows = map_size_row;
	*result_size_cols = map_size_cols;
 
	return res;
}
 
int main() {
	int res_size_rows, res_size_cols;
	long** res;
 
	long _N;
	scanf("%ld", &_N);
	long _M;
	scanf("%ld", &_M);
	int _map_rows = 0;
	int _map_cols = 0;
	scanf("%d", &_map_rows);
	scanf("%d", &_map_cols);
 
	long** _map = (long**)malloc(_map_rows*sizeof(long*));
	int _map_init_i = 0;
	for (_map_init_i = 0; _map_init_i < _map_rows; ++_map_init_i)
	{
		_map[_map_init_i] = (long*)malloc(_map_cols*(sizeof(long)));
	}
 
	int _map_i, _map_j;
	for (_map_i = 0; _map_i < _map_rows; _map_i++) {
		for (_map_j = 0; _map_j < _map_cols; _map_j++) {
			long _map_item;
			scanf("%ld", &_map_item);
 
			_map[_map_i][_map_j] = _map_item;
		}
	}
 
	res = Solve(_N, _M, _map_rows, _map_cols, _map, &res_size_rows, &res_size_cols);
	int res_i, res_j;
	for (res_i = 0; res_i < res_size_rows; res_i++) {
		for (res_j = 0; res_j < res_size_cols; res_j++) {
			printf("%ld ", res[res_i][res_j]);
		}
		printf("\n");
	}
 
	return 0;
 
}