1. 程式人生 > 其它 >過河卒

過河卒

技術標籤:演算法演算法

dp入門–過河卒

題目描述

棋盤上 A 點有一個過河卒,需要走到目標 B 點。卒行走的規則:可以向下、或者向右。同時在棋盤上 C 點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。

棋盤用座標表示,A 點 (0, 0) 、B 點 (n, m),同樣馬的位置座標是需要給出的。
在這裡插入圖片描述
現在要求你計算出卒從 A 點能夠到達 B 點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

輸入格式

一行四個正整數,分別表示 B 點座標和馬的座標。

輸出格式

一個整數,表示所有的路徑條數。

輸入#1
6 6 3 3
輸出#1
6
說明/提示

對於 100% 的資料,1 ≤ n , m ≤ 20,0 ≤ 馬的座標 ≤ 20。

【題目來源】

NOIP 2002 普及組第四題

方法一:遞推

這道題最好用矩陣儲存圖,這裡我們建立一個二維陣列a,一般用矩陣的情況下,我們都可以把起點座標從(1,1)開始處理
先標記出不能走的點,出了馬控制的那九個點外,還需要把邊界座標含0的點給標記出來
然後我們開始推遞推式,能夠很容易想到的是每個點的路線數都等於上面一個點的路線數加上左邊一個點的路線數,並且原點的路線數為1,路線數我們建立一個狀態陣列f;於是我們可以得到遞推式

遞推式:f[i][j] = f[i-1][j] + f[i][j-1]

方法二:dfs

陣列建立和處理基本和方法一樣,但這裡不需要再寫一個狀態陣列,這裡我們可以建立一個全域性整型變數ans來代表路線數,然後再dfs到終點時,ans+1即可

具體程式碼後續再上傳(別刀我…)