[LUOGU1002]過河卒

題目描述

棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱爲對方馬的控制點。因此稱之爲“馬攔過河卒”。

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

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

輸入輸出格式

輸入格式:
一行四個數據,分別表示B點座標和馬的座標。

輸出格式:
一個數據,表示所有的路徑條數。

輸入輸出樣例

輸入樣例#1:
6 6 3 3
輸出樣例#1:
6
說明

結果可能很大!
遞推

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int b[105][105];
long long f[105][105];
long long e,d,p,q;
int main()
{
    cin>>e>>d>>p>>q;
    b[p][q]=1;
    for(int i=-2;i<=2;i++)
        for(int j=-2;j<=2;j++)
        {
            if(abs(i)!=abs(j) && i!=0 && j!=0 && p+i>=0 && q+j>=0)
                b[p+i][q+j]=1;
        }
        f[0][0]=1;
        for(int i=0;i<=e;i++)
            for(int j=0;j<=d;j++)
            {
                if(i>=1 && !b[i-1][j] )
                    f[i][j]+=f[i-1][j];
                if(j>=1 && !b[i][j-1] )
                    f[i][j]+=f[i][j-1];
            }
        cout<<f[e][d]<<endl;
    return 0;
}

動態規劃

#include<iostream>
using namespace std;
long long f[25][25];
int dx[8]={1,1,-1,-1,2,2,-2,-2},
    dy[8]={2,-2,2,-2,1,-1,1,-1};
int n,m,x,y;
int main()
{
    cin>>n>>m>>x>>y;
    f[x][y]=-1;
    for(int i=0;i<8;i++)
    {
        int xx=x+dx[i];
        int yy=y+dy[i];
        if(xx>=0 && xx<=n && yy>=0 && yy<=m)
            f[xx][yy]=-1;
    }
    if(f[0][0]!=-1)
    {
        f[0][0]=1;
        for(int i=0;i<=n;i++)
            for(int j=0;j<=m;j++)
                if(f[i][j]!=-1)
                {
                    if(i>=1&&f[i-1][j]!=-1) 
                        f[i][j]+=f[i-1][j];
                    if(j>=1&&f[i][j-1]!=-1)
                        f[i][j]+=f[i][j-1];
                }
        cout<<f[n][m]<<endl;
    }
    else 
        cout<<0<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章