1. 程式人生 > >NOIP2002-過河卒題解

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,