阿里巴巴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; }