遞推2 過河卒(Noip2002)

2021-09-07 12:02:43 字數 1570 閱讀 6303

寫出遞推公式就ok了,具體程式設計還是很簡單的

過河卒(noip2002)

【問題描述】

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

棋盤用座標表示,a點(0, 0)、b點(n, m),(n, m為不超過20的整數),同樣馬的位置座標是需要給出的。c≠a且c≠b。現在要求你計算出卒從a點能夠到達b點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

這裡取起點:a(0,0)   終點:b(4,8)   馬的位置:c(2,4)

1/*2

過河卒問題

3f[r][c]表示到達(r,c)位置的路徑條數

4只能從上面來或者從左邊來

5f[r][c]=從上面一行來+從左邊一列來

6f[r][c]=f[r-1][c]+f[r][c-1]

7如果這點被馬控制,那麼:

8f[r][c]=0;

9所以從上往下,從左往右依次遞推就好了

10那些邊界都為0,且f[0][0]=1

11*/

12 #include 13

#define max 25

14using

namespace

std;

15//

r在前c在後

16int horsecontrol[9][2]=,,,,,,,,};

17int dp[max][max];//

f[r][c]表示到達(r,c)位置的路徑條數

18int horse[max][max];//

判斷該點是否被馬控制

1920

//初始化馬的控制點

21void inithorsecontrol(int r,int c);//

對house初始化為0

23for(int i=0;i<9;i++)29}

30}

3132

//顯示陣列中的內容

33void showarray(int x,int y,int

a[max][max])

38 printf("\n"

);39}40

} 41

42//

初始化棋盤

43void initchessboard(int r,int

c)47

for(int j=0;j<=c;j++)

50 dp[0][1]=1;51

}5253//

遞推操作

NOIP 2002 過河卒(DP遞推)

棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 bb點 n,m n,m為不超過2020的整數 同樣馬的位置座標是需要給出的。現在要求...

noip2002 普及組 過河卒

題目描述 棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 b點 n,m n,m為不超過20的整數 同樣馬的位置座標是需要給出的。現在...

NOIP 2002普及組 過河卒詳解

本文引用自 kcfzyhq 的部落格 首先我們來看看下面這個圖,這個圖基本表現了題目的意思 乙個卒要從圖的左上角a點走到右下角b點,而其中有一點c為馬的位置,c與其周邊馬能走到的p1 p8點共9個點是不能走的,問有多少種從a走到b的方法 我們可以先把這個問題當數學問題來考慮相信許多朋友以前都遇到過類...