記錄一次失敗的coding面

  很想去的一家無人駕駛創業公司,技術面過了兩面,面試官評價也都不錯,敗在了最後的coding面上。原本還存在僥倖的心理,但仍是在生日這天收到了HR拒絕的電話。ios

  很沒出息的掉了幾大滴眼淚,痛定思痛,把那天沒作出來的題目又翻出來敲了一次,發現理順了思路其實真的蠻簡單的。被拒絕也是能夠理解的吧。面試

  

  上圖是面試官出的題目,題目描述大體爲:有一我的被困在最中心五角星標的位置,求最短的出去的路徑是多少?每到達一個節點的花費是節點上的數字,出去是指達到白色的沒有標數字的區域,迷宮層數不限。算法

  一開始想用暴力搜索來求解,面試官讓計算一下這種算法的時間複雜度,結果是n的指數型的。後來通過面試官提醒,想到了動態規劃的求法,可是由於第一次用到嵌套vector,點之間的對應關係也很混亂,代碼寫得一塌糊塗,中間也屢次想放棄。最後仍是提交了個半成品上去,本身都不太想再看本身的代碼。函數

  今天從新梳理了一下思路:不考慮往回走(這裏只是個假設,是最簡單的狀況,往回走的狀況等之後再思索吧),從n層裏回縮,記下與n-1層的每一個節點相連的n層節點中最小的節點,一直回縮到第二層,也就是隻有4個節點的層,這時候就能夠比較四個元素的大小了,從而找到最小路徑和。spa

  程序輸入爲:第一個數爲迷宮層數,而後從內到外輸入迷宮的數字,每層按照順時針順序輸入,從左上角開始。上圖的輸入應該爲:blog

3
1
6 4 3 2
7 8 2 9 1 7 8 3

  代碼以下:遞歸

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

vector< vector<int> > matrix;  // 存儲迷宮
vector<int> res;  // 存儲每次回縮的最小路徑
int shortest;  // 最小路徑和(不包括最裏層)


void dg(int layer_num)
{
	if (layer_num == 0)
	{
       // 第一次使用 std::min()函數, 定義在 #include<algorithm>裏
		shortest = min({ res[0], res[1], res[2], res[3] });
		return;
	}
		
	int i = layer_num;
	
	for (int j = 0; j < 4 * i; j++)
	{
		int minX;

		if (j == 0)  // 第一個點單獨處理
		{
			minX = min({ res[4 * (i + 1) - 1], res[0], res[1] });
			res[j] = minX + matrix[i][j];
			continue;
		}
		int x = (j - 1) / i;  // 利用x從而簡化n層與n-1層點的對應關係
		if (j%i == 0)   // 三個角(除去第一個點)所連的外層有三個點
		{
			minX = min({ res[j + x], res[j + x + 1], res[j + x + 2] });
		}
		else  // 內點所連的外層有兩個點
		{
			minX = min({ res[j + x], res[j + x + 1] });
		}

		res[j] = minX + matrix[i][j];  // 將n層的最小值回縮並加到第n-1層上
	}
	dg(i - 1);  //遞歸

}
int main()
{
	int layer_num;	
	vector<int> layer;
	int ele;

	// 讀取圖數據
	cin >> layer_num;
	for (int i = 0; i < layer_num; i++)
	{
		if (i == 0)
		{
			cin >> ele;
			layer.push_back(ele);
			matrix.push_back(layer);
			layer.clear();
			continue;
		}
		for (int j = 0; j < 4 * i; j++)
		{
			cin >> ele;
			layer.push_back(ele);
			if (i == layer_num - 1)
			{
				res.push_back(ele);  // 一開始的res初始爲最外層的一圈數字
			}				
		}
		matrix.push_back(layer);
		layer.clear();
	}

	dg(matrix.size() - 2);
	cout << shortest + matrix[0][0]<< endl;

	return 0;
}
相關文章
相關標籤/搜索