洛谷題解P1002 過河卒

2021-10-18 08:16:43 字數 1842 閱讀 5707

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

棋盤用座標表示,a點 (0,0)、b點 (n,m),同樣馬的位置座標是需要給出的。

現在要求你計算出卒從 a 點能夠到達 b點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

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

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

輸入 6 6 3 3

輸出 6

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

noip 2002 普及組第四題

馬走日這一點不要忽視。

(對於不下象棋的人很容易忽視,比如說,我)

接下來分析題目

可以看到 卒的行走規則為向右或者向下,從這裡我們可以推斷出,乙個點,它的可能**只有兩個,乙個是左邊,乙個是上面。因此,這裡我們的遞推式出現了,即到達(i,j)點的路徑為到達左邊點的路徑和到達上邊點的路徑之和。

遞推式如下:a(i,j)=a(i-1,j)+a(i,j-1)

這也是一條自底向上的動態規劃的題。

因此下面為這道題的解法**

#includeusing namespace std; 

int main()

;//座標初始化為0.並且將陣列的下標範圍設定的稍微大一點

cin>>endcolumn>>endrow>>horsecolumn>>horserow;

int horse[30][30]=;

coord[startcolumn][startrow]=1;

endcolumn+=2;

endrow+=2;

horsecolumn+=2;

horserow+=2;

//統一加上2是為了等一下加加減減的時候不至於越界

horse[horsecolumn-2][horserow+1]=1;

horse[horsecolumn+2][horserow+1]=1;

horse[horsecolumn-1][horserow+2]=1;

horse[horsecolumn+1][horserow+2]=1;

horse[horsecolumn+2][horserow-1]=1;

horse[horsecolumn+1][horserow-2]=1;

horse[horsecolumn-1][horserow-2]=1;

horse[horsecolumn-2][horserow-1]=1;

horse[horsecolumn][horserow]=1;

//標記馬可以走到的位置

/*這裡可以推斷出遞推式

因為題目中給出只能夠走右邊或者下邊,因此相應的,乙個點的位置也只能是上邊或者是左邊

這樣我們得到遞推式:

coord[i][j]=coord[i-1][j]+coord[i][j-1]

*/ int i=0,j=0;

for(i=2;i<=endcolumn;i++)

else

{//if(coord[i][j]這道題相對來說還是比較簡單,但是需要注意的是它的路徑數可能很多,需要申請的範圍為long long int

另外,最初我在寫這道題的時候比較傾向於用指標來寫,但是那樣會超過時間,所以最後被捨棄了。

洛谷 P1002 過河卒

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

洛谷P1002過河卒

dp水題,我都會做 我們考慮地圖上i,j的位置可以怎麼過來,因為卒只能向下或向右,所以當前位置只能由它的上方或左方轉移過來,所以f i j f i 1 j f i j 1 然後考慮邊界情況,沿著上沿和左沿只能向乙個方向走,所以f i 0 0,f 0 i 0,這是不考慮有馬的情況,當馬加入圖中後,我們...

洛谷 P1002 過河卒

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