洛谷 P1002 過河卒

2021-09-19 17:50:30 字數 1240 閱讀 6422

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

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

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

輸入格式:

一行四個資料,分別表示b點座標和馬的座標。

輸出格式:

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

這題可以自己在草稿紙上數一下,到乙個點到底有幾種方法,然後思考一下(霧),即可得到:到達(x,y)的方法數等於到達(x-1,y)的方法數+到達(x,y-1)的方法數,因為到達乙個點只能從上或從左,到這個點的方法數自然等於到上的方法數加到左的方法數。然後不能去的地方特判一下,設成0,還有最左邊一列和最上邊一行遞推邊界特殊處理一下(見下),然後……就沒有然後了。

(粘乙個爛大街但又很好懂的解析)對本題稍加分析就能發現,到達棋盤上的乙個點,只能從左邊過來(我們稱之為左點)或是從上面過來(我們稱之為上點)。根據加法原理,到達某一點的路徑條數,就等於到達其相鄰的上點或左點的路徑數目總和。因此我們可以使用逐列(逐行)遞推的方法來求出從起點到終點的路徑數目。障礙點(馬的控制點)也完全適用,只要將到達該點的路徑數目設定為0即可。

假設用f[i,j]到達點(i,j)的路徑數目用g[i,j]表示點(i,j)是否為對方馬的控制點,g[i,j]=0表示不是對放馬的控制點,g[i,j]=1表示是對方馬的控制點。則,我們可以得到如下的遞推關係式:

f[i,j]=0

f[i,0]=f[i-1,0]

f[0,j]=f[0,j-1]

f[i,j]=f[i-1,j]+f[i,j-1]

上述遞推式邊界是:f[0,0]:=1。考慮到最大情況下:n=20,m=20,路徑條數可能會出現超出長整型範圍,所以要用int64或comp型別計數或者高精度運算(是不是要開乙個三維陣列呢)。

#includeshort g[25][25

];int

main()

//邊界如果為零,那它後面的都不可到達,我傻傻的把後面的照樣賦值為1,0~60分不等

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

//printf("\n");

} printf(

"%lld

",f[bn][bm]);

return0;

}

洛谷 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點的座標範圍就可以求出陣列的行列範圍了 用來儲存每乙個點到達點b的路徑數 為防止馬的攔截點跑出去,需要將出發點a 0,0 轉化為陣列中的 1,1 這個時候要稍微調整遍歷範圍,記得要開到23格。由於資料可能較大,陣列型別用long long...