棋盤上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型別計數或者高精度運算(是不是要開乙個三維陣列呢)。
#include//這個編輯器的縮排比較怪異
short g[25][25];
int main()
//邊界如果為零,那它後面的都不可到達,我傻傻的把後面的照樣賦值為1,0~60分不等
for(int i=1;i<=bn;i++)
//printf("\n");
}printf("%lld",f[bn][bm]);
return 0;
}
洛谷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的整數 同樣馬的位置座標是需要給出的。現在要求你計算...
洛谷P1002 過河卒
題目就不介紹了,自己找找就行了,應該比較容易找到。看到a點和b點的座標範圍就可以求出陣列的行列範圍了 用來儲存每乙個點到達點b的路徑數 為防止馬的攔截點跑出去,需要將出發點a 0,0 轉化為陣列中的 1,1 這個時候要稍微調整遍歷範圍,記得要開到23格。由於資料可能較大,陣列型別用long long...