P1002 NOIP2002 普及組 過河卒

2021-10-17 14:20:56 字數 1696 閱讀 5669

最近在洛谷刷題,決定用部落格把自己的解題思路以及踩過的坑整理總結一下~

先來看看題目吧~

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

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

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

輸入格式

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

輸出格式

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

思路剛拿到題的時候,有點不知道怎麼做,只覺得要用動態規劃,但是沒有想好方程是怎麼樣的。

錯得離譜的思路就不說了,說說還不錯的思路。

定義乙個陣列用來存到該點的路徑條數,路徑條數怎麼得到呢?

往下看因為只能向下或向右去走,所以到乙個點只有通過它左邊的路或上邊的路

那麼來了!!!

到某點的路徑條數=到它左邊點的條數+到它上面點的條數(前提是這兩點都可到)

這時候我們想一想就可以得到動態規劃方程

不過我這裡倒是犯了乙個錯誤,我想當然的把到邊線上的點的路徑條數預設成1了,雖然一般情況適用,可是當馬的控制範圍包含了某個邊線上的點時,是wa了!

真正到邊線上的點的路徑條數應該是他的上乙個點的條數(上邊界就是它左邊的點,左邊姐就是它上邊的點)

if(i==0&&j>0)//上邊界

else if(j==0&&i>0)//左邊界

那麼還有乙個特殊點,就是原點(起點),到它的路徑條數是多少呢?

很明顯,就是1

if(i==0&&j==0)//原點

a[i][j]=1;

剩下的點就是普通點了,到它們的路徑條數當然就是到它左邊點的條數+到它上面點的條數

else

要注意!!我們討論的這三類點都是在它可到達的情況下討論的,也就是說不受馬控制的點,那麼怎麼實現呢?

當然在外面加一層if判斷就好了!

好了,到這裡,方程就基本出來了,剩下的就看**吧,呼呼~

#include

using

namespace std;

intmain()

for(int i=1;i<=m;i++)

*///動態規劃求到各點的路數

for(

int i=

0;i<=n;i++

)else

if(j==

0&&i>0)

else}}

} cout<[m]

}

over,這道題就結束了~~第一次寫部落格,如果有幫到大家,非常榮幸,寫得不好,也請見諒,啦啦

P1002 NOIP2002 普及組 過河卒

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

NOIP 2002 普及組 數字遊戲

題目鏈結 題目分析 這道題是一道區間dp題,跟能量項鍊還有石子合併差不多,我們用f i j l 表示處理i到j這一區間分為l段所能得到的最大值或是最小值。具體看 程式 include include include include include using namespace std int n,...

NOIP2002 普及組 選數

題目描述 已知 n 個整數 x1,x2,xn,以及乙個整數 k k n 從 n 個整數中任選 k 個整數相加,可分別得到一系列的和。例如當 n 4,k 3,4 個整數分別為 3,7,12,19 時,可得全部的組合與它們的和為 3 7 12 22 3 7 19 29 7 12 19 38 3 12 1...