題目很簡單,注意方向只能選左右中的乙個和上下中的乙個,既然要走到目的地,那麼方向已經決定了,就是盡量靠近目的地。
分析:紅色的圈表示起點,紅色三角形表示終點。這裡如果向上走或者向右走,那麼永遠到不了終點,所以路徑只會在兩個點構成的矩形中,並且方向只有兩個。
按照上圖,假設向左走,走一步到綠色圈的位置,或者向下走一步到藍色的圈的位置(這裡暫時假設沒有障礙),對於這兩種走法,都會形成乙個新的移動矩形(用不同顏色表示),子問題的解組成原問題的解,動態規劃。
設水平和垂直移動方向分別為v(左移為-1,右移為1,有障礙為0)和h,從起點座標(x,y)到終點座標(desx,desy)的方案數為f(x,y),則有下面狀態轉移方程:
有了這個,**就很容易了:
1因為要把移動了之後的陣列傳入遞迴方法,所以需要對陣列進行clone操作,這裡不能直接對二維陣列進行clone操作,需要通過for迴圈逐層拷貝,否則會因為引用相同而使得ver和hor陣列的內容相同。public
int countpath(int map, int n, int
m) 11
if (map[i][j] == 2) 15}
16}17if (desx == x) 22}
23return 1;24}
25if (desy ==y) 30}
31return 1;32}
33 horizontal = desx - x > 0 ? 1 : -1; //
確定水平方向
34 vertical = desy - y > 0 ? 1 : -1; //
確定垂直方向
35int ver = new
int[map.length];
36for (int i = 0; i < ver.length; i++)
39 ver[x][y] = 0;
40 ver[x + vertical][y] = 1;
41int hor = new
int[map.length];
42for (int i = 0; i < hor.length; i++)
45 hor[x][y] = 0;
46 hor[x][y + horizontal] = 1;
47if (map[x + vertical][y] == -1)
50if (map[x][y + horizontal] == -1)
53return countpath(ver, n, m) + countpath(hor, n, m); //
如果方向沒限制,則結果為水平走和垂直的和
54 }
2016美團校招真題 二維陣列列印
有乙個二維陣列 n n 寫程式實現從右上角到左下角沿主對角線方向列印。給定乙個二位陣列arr及題目中的引數n,請返回結果陣列。測試樣例 1,2,3,4 5,6,7,8 9,10,11,12 13,14,15,16 4 返回 4,3,8,2,7,12,1,6,11,16,5,10,15,9,14,13...
面試題 美團面試準備
重要原題 執行緒池原理 引數,執行緒是如何維持住的 ftp http埠號 http狀態碼,502和504的區別 http請求到相應的全過程 泛型的原理 類載入器原理 mybatis為什麼區分不同的標籤 aqs常用垃圾 器以及如何選擇?如何解決full gc問題 四則運算器 阿拉伯數字轉漢字 二叉樹節...
校招經典面試題
作業系統 執行緒同步的方式有哪些 程序的通訊方式有哪些 什麼是緩衝區溢位?有什麼危害?造成的原因是什麼 什麼是死鎖?死鎖產生的條件?解決死鎖的方法?解決方法 程序有哪幾種狀態?程序排程策略有哪幾種?為什麼在儲存中引入虛擬儲存器 核心的作用 使用者態和核心態 資料結構和演算法 有哪些常見的資料結構 常...