1. 程式人生 > 實用技巧 >洛谷-P1002 過河卒

洛谷-P1002 過河卒

洛谷-P1002 過河卒

原題連結:https://www.luogu.com.cn/problem/P1002


題目描述

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

棋盤用座標表示,\(A\)\((0, 0)\)\(B\)\((n, m)\),同樣馬的位置座標是需要給出的。

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

輸入格式

一行四個正整數,分別表示 \(B\) 點座標和馬的座標。

輸出格式

一個整數,表示所有的路徑條數。

輸入輸出樣例

輸入 #1

6 6 3 3

輸出 #1

6

說明/提示

對於 \(100 \%\) 的資料,\(1 \le n, m \le 20\)\(0 \le\) 馬的座標 \(\le 20\)

C++程式碼

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int n, m, u, v;
    cin >> n >> m >> u >> v;
    long long int a[n+1][m+1];
    for (int i=0; i<=n; ++i)
        for (int j=0; j<=m; ++j)
            if (i == 0 && j == 0)
                a[i][j] = 1;
            else if (i==u&&j==v || abs(i-u)==1&&abs(j-v)==2 || abs(i-u)==2&&abs(j-v)==1)
                a[i][j] = 0;
            else if (j == 0)
                a[i][0] = a[i-1][0];
            else if (i == 0)
                a[0][j] = a[0][j-1];
            else
                a[i][j] = a[i-1][j] + a[i][j-1];
    cout << a[n][m] << endl;
    return 0;
}