NOIP2002-過河卒題解
題目描述
棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。
棋盤用座標表示,A點(0, 0)、B點(n, m)(n, m為不超過20的整數),同樣馬的位置座標是需要給出的。
現在要求你計算出卒從A點能夠到達B點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
輸入格式:一行四個資料,分別表示B點座標和馬的座標。
輸出格式:一個數據,表示所有的路徑條數。
輸入樣例#1:6 6 3 3輸出樣例#1:
6
說明
結果可能很大!
程式碼如下:
解題報告:#include<stdio.h> long long B[21][21]; int main(void) { int i,j,n,m,a,b; scanf("%d%d%d%d",&n,&m,&a,&b); for(i=0;i<=n;i++) for(j=0;j<=m;j++) B[i][j]=1; if(a-2>=0&&b-1>=0) B[a-2][b-1]=0; if(a-2>=0&&b+1<=m) B[a-2][b+1]=0; if(a-1>=0&&b-2>=0) B[a-1][b-2]=0; if(a-1>=0&&b+2<=m) B[a-1][b+2]=0; if(a+1<=m&&b-2>=0) B[a+1][b-2]=0; if(a+2<=n&&b-1>=0) B[a+2][b-1]=0; if(a+1<=n&&b+2<=m) B[a+1][b+2]=0; if(a+1<=n&&b+1<=m) B[a+2][b+1]=0; B[a][b]=0; for(i=0;i<=n;i++) { for(j=0;j<=m;j++) { if(B[i][j]) { if(i==0&&j==0) continue; else if(i==0) B[i][j]=B[i][j-1]; else if(j==0) B[i][j]=B[i-1][j]; else B[i][j]=B[i-1][j]+B[i][j-1]; } } } printf("%lld",B[n][m]); /*第一次是用int 後來發現有點小改成long long 之後一直錯 上網查了一下下午終於在下午五點發現輸出居然用%d!!! 這道題略坑,我早上11點做到17:55..只是因為這樣一個錯誤。百密一疏呀。*/ return 0; }
首先看一道數學的例子:求(0,0)到(4,4),沿著線段走,一共有多少條路徑。規則:可以向下、或者向右
解這道題很簡單。 令邊界都為1 寫出個狀態方程: a[i][j]=a[i-1][j]+a[i][j-1]有了這個公式就好辦了。看圖:
如果沒有錯誤的話答案就是252條。
我們變一下題目,如果馬在(3,3),則有多少條路?
我們令馬所能走的地方包括馬所在的位置都為0
則畫出圖
這圖是對的嗎 答案是對的。 馬的位置設定得不好。 這樣畫是錯的。
應該這樣畫,藍色的變0:
為什麼? 題目規定了只能向下或者向右走,馬頭分身擋住了,後面自然不通。 紫色後面就不通了,所以當在邊界的時候比較特殊。同時不難發現在邊界的路線只有1條或者0條 所以我們可以讓每一個邊界頂點等於前一個邊界頂點值,如果這樣在遇到一個馬頭後設置為0,後面全為0 這在解題的時候是個陷阱:
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
{
if(B[i][j])
{
if(i==0&&j==0) continue;
else if(i==0) B[i][j]=B[i][j-1];//當在最上面一行的時候
else if(j==0) B[i][j]=B[i-1][j];//當在最左邊的時候
else B[i][j]=B[i-1][j]+B[i][j-1];
}
}
}
相關推薦
NOIP2002-過河卒題解
題目描述 棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。 棋盤用座標表示,A點(0, 0)、B點(n, m)(n, m為不超過
NOIP2002-過河卒—經典的dp思想
如圖,A 點有一個過河卒,需要走到目標 B 點。卒行走規則:可以向下、或者向右。同時在棋盤上的任一點有一個對方的馬(如上圖的C點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 C 點上的馬可以控制 9 個點(圖中的P1,P2 … P8 和 C)。卒不能通過對方馬的控制點。 棋盤用
【例3.6】過河卒(Noip2002)
info 時間 img () size 控制 分享圖片 sso 輸出 【題目描述】 棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上的某一點有一個對方的馬(如C點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點,如圖3-1中的
過河卒(Noip2002)
【題目描述】 棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上的某一點有一個對方的馬(如C點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點,如圖3-1中的C點和P1,……,P8,卒不能通過對方馬的控制點。棋盤用座標表示,A點(0,0)、B點(n, m)
NOIP2002-PJ-4 過河卒
A 點有一個過河卒,需要走到目標 B 點。卒行走規則:可以向下、或者向右。同時在棋盤上的任一點有一個對方的馬(如上圖的C點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 C 點上的馬可以控制 9 個點(圖中的P1,P2 … P8 和 C)。卒不能通過對
luogu1002 過河卒(NOIP2002普及組第4題)
時空限制 1000ms/128MB題目描述棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。棋盤用座標表示,A點(0, 0)、B點(
洛谷 過河卒 p1002 題解
其實這道題如果你會遞推,搞清楚問題的本質就很簡單了 首先我們要知道加法原理,加法原理是什麼呢?舉個栗子:如果我們去上海只可以坐火車,坐飛機。而火車有n班次,飛機有m班次。那麼總共去上海就有(n+m)種方式。 之後,我們就可以推出這個題目的遞推表示式: (ps:我們用f
luogu P1002 過河卒
for clas tro ret iostream article 表示 格式 strong 題目描述 棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因
過河卒
cnblogs https ring string end lan tar stream alt 鏈接 分析:當前點的情況僅由其左邊和上邊的點決定,然後馬會走過的點標記一下即可 1 #include "iostream" 2 #include "cstdio" 3
luogu_1002 過河卒
std sin sum turn main void += space name //哇塞,真的坑,要long long = = #include <iostream>using namespace std;long long a[30][30];int n
2002普及組第四題過河卒
upload eight print 比較 通過 pro online ret 過河 題目描述 如圖,A 點有一個過河卒,需要走到目標 B 點。卒行走規則:可以向下、或者向右。同時在棋盤上的任一點有一個對方的馬(如上圖的C點),該馬所在的點和所有跳躍一步可達的點稱為對方馬
acm過河卒
tdi edi 需要 p1010 有一個 med bsp 查詢 不用 如圖,A 點有一個過河卒,需要走到目標 B 點。卒行走規則:可以向下、或者向右。同時在棋盤上的任一點有一個對方的馬(如上圖的C點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 C 點上
DP 過河卒
數據 一個數 lld 所有 clu pri lose 控制 spa 棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。 棋盤用坐標表示,
18.07.01 luoguP1002 過河卒
假設 string sam 位置 clu ++ using alt lap 題目描述 棋盤上 AA 點有一個過河卒,需要走到目標 BB 點。卒行走的規則:可以向下、或者向右。同時在棋盤上 CC 點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱
P1002 過河卒
tar 就是 click 地圖 .org ati tps line span 題面 題面 看題面第一眼就覺得是DFS看了一下提示,結果很大=v=,想了一下用遞推= = 就是類似於小學奧數 首先是輸入 先把地圖上馬能踩到的位置標出來P1002 過河卒
遞推問題之馬踏過河卒問題
-a 固定 能夠 沒有 就是 數據 nbsp size turn problem 棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔
經典動態規劃之過河卒【洛谷 P1002】
傳送門 因為小兵只能往右走和往下走 所以動態轉移方程為map[i][j]=map[i-1][j]+map[i][j-1] 感覺上。。是很經典的。 題目描述 棋盤上AAA點有一個過河卒,需要走到目標BBB點。卒行走的規則:可以向下、或者向右。同時在棋盤上CCC點有一個對方的馬,該馬所在
洛谷 P1002 過河卒(一維dp)
題目描述 棋盤上 AA 點有一個過河卒,需要走到目標 BB 點。卒行走的規則:可以向下、或者向右。同時在棋盤上 CC 點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。 棋盤用座標表示
p1293 馬攔過河卒
題目 描述 Description 棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。 棋盤用座標表示,A點(0, 0)、B點(n, m
過河卒 NOIp 2002 dp
題目描述 棋盤上AAA點有一個過河卒,需要走到目標BBB點。卒行走的規則:可以向下、或者向右。同時在棋盤上CCC點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。 棋盤用座標表示,AAA點(0,0)(0, 0)(0,0)、BBB點(n,m)(n,