【検索】洛谷P 1022川卒

3947 ワード

タイトルの説明
碁盤のA点には川を渡る卒がいて、目標のB点まで歩く必要があります.歩行のルール:下へ、または右へ.同時に碁盤上のC点には相手の馬があり、その馬がいる点とジャンプして一歩で達する点を相手の馬の制御点と呼ぶ.そのため「馬が川を渡る卒」と呼ばれている.
碁盤は座標で表され、A点(0,0)、B点(n,m)(n,mは20を超えない整数)と同様に馬の位置座標が与えられる必要がある.
今、卒がA点からB点に到達できる経路の数を計算するように要求されます.馬の位置が固定されていると仮定して、卒が一歩歩いて馬が一歩歩いているわけではありません.
にゅうしゅつりょくけいしき
入力形式:
1行の4つのデータで、それぞれB点座標と馬の座標を表します.
出力フォーマット:
すべてのパス・バー数を表すデータ.
入出力サンプル
サンプル#1を入力:
6 6 3 3
出力サンプル#1:
6
説明
結果は大きいかもしれません!
構想
プッシュ.各格子のステップ数は、左と上の格子のステップ数の和に等しい
コード#コード#
#include
using namespace std;
int Dx[8]={2,1,-1,-2,-2,-1,1,2};
int Dy[8]={1,2,2,1,-1,-2,-2,-1};
long long a[105][105];
bool b[105][105];
int main()
{
    int n,m,x,y;
    cin>>n>>m>>x>>y;
    b[x][y]=1;
    a[0][0]=1;
    for(int i=0;i<8;i++)
    {
        if(x+Dx[i]>=0&&x+Dx[i]<=n&&y+Dy[i]>=0&&y+Dy[i]<=m)
        b[x+Dx[i]][y+Dy[i]]=1;
    }
    for(int i=1;i<=n;i++)if(b[i][0]==0)a[i][0]=a[i-1][0]; 
    for(int j=1;j<=m;j++)if(b[0][j]==0)a[0][j]=a[0][j-1];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(b[i][j]==0)a[i][j]=a[i-1][j]+a[i][j-1];
            else a[i][j]=0;
        }
    }
    cout<return 0;
}