Tyvj 1004
問題描述: 輸入一個 r*c 的矩陣,並且矩陣中的每個元素都是
正整數,從其中某個大的元素出發,向4個方向(上下左右)
遞迴,直到划出一條能夠通過較多數位線,並且滿足數字
從大到小。
解決方案: 其實,我們可以人為的把我們輸入的每一個元素所對應
的數值當做是一座座的山峰,正如題目要求的那樣,滑雪
然後儘可能從高處的山峰往低處的山峰滑行,第一次做的
時候,沒看懂範例,琢磨了一段時間後,突然明白了,題目
的含義,實際上就是按照一定的路線,從最大的元素向最小的
元素走,然後記錄所走的步數即可,範例很特殊,25步走出來
後,剛好構成了蛇形陣。
第一步,一一枚舉每個點,看他是不是能作為我們開始滑行
的起點。
第二步,找到這個點後,向4個方向DFS,即可。
第三步,找到的那個最大的起點,就是我們的最大路線
代碼: (1)在代碼中,學會了一種解決搜尋問題的常用方法,那就是設定
一個dis [][],數組,當我們向4個方向,也就是通常所說的
上下左右進行搜尋時,我們就定義這樣一個數組:
dis[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
其實很簡單,,大家腦補下就行。。。。
如果所涉及的問題稍微有些複雜的話,向8個方向進行搜尋
那麼我們定義這樣一個數組:
dis[8][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1}
,{1,-1},{1,0},{1,1}};
思路和方法類似,就是又多了4個對角線上的方向而已~
(2)並且在搜尋問題中,我們還要設定一個vis[][]數組,這個
數組的大小和處理問題時所開的數組一定是等大的。
並且一開始用memset對vis數組進行初始化,可以初始化為
0或者-1,,其他的數值都不行的。
貼上模板~~
int nx, ny; for ( int i = 0;i < 4;i++ ) { nx = x + dis[i][0]; ny = y + dis[i][1]; if ( 0 <= nx&&nx < r&&0 <= ny&&ny < c&&a[x][y] > a[nx][ny] ) { t = max( search( nx, ny ),t ); } }
當做模板記住它~
其實在很多情況下,如果實在看不出那些大牛們的代碼。
可以手模下,,雖然浪費時間,但是很容易就能理解了,
我就是這麼手模過來的~~~