C++ River Crossing Pawn-Problem

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

int board[20][20]; // 棋盘
int dp[20][20][20][20]; // 动态规划数组

int main() {
    int x0, y0, x1, y1;
    cin >> x0 >> y0 >> x1 >> y1;  // 输入卒的起点和终点

    memset(board, 0, sizeof(board));  // 初始化棋盘

    // 初始化动态规划数组
    memset(dp, 0, sizeof(dp));
    dp[x0][y0][0][0] = 1;
    for(int i = x0; i <= x1; i++) {
        for(int j = y0; j <= y1; j++) {
            if(board[i][j] == 1) continue;  // 如果该点有障碍物则跳过
            if(i > x0) dp[i][j][i-x0][0] += dp[i-1][j][i-x0-1][0];  // 上方的状态转移
            if(j > y0) dp[i][j][0][j-y0] += dp[i][j-1][0][j-y0-1];  // 左方的状态转移
        }
    }

    cout << dp[x1][y1][x1-x0][y1-y0] << endl;  // 输出方案数

    return 0;
}

        Unter diesen repräsentiert das dynamische Programmierarray dp[i][j][x][y] den Übergang vom Startpunkt (x0, y0) zum aktuellen Punkt (i, j) Auf dem Weg , was bedeutet, dass ausgehend vom Startpunkt die Anzahl der Optionen, die unterwegs keine Zeilen oder Spalten durchlaufen, 1 beträgt.  Spalten, wie viele Optionen es insgesamt gibt. Der Anfangszustand ist x Zeilen, ydp[x0][y0][0][0] = 1

Die Zustandsübergangsgleichung lautet:

dp[i][j][x][y] = dp[i-1][j][x-1][y] (如果 i > x0 && board[i][j] != 1)
                + dp[i][j-1][x][y-1] (如果 j > y0 && board[i][j] != 1)
Unter anderem gibt board[i][j] an, ob sich an Punkt (i, j) auf dem Schachbrett ein Hindernis befindet. Wenn es an diesem Punkt ein Hindernis gibt, können Sie diesen Punkt nicht passieren. Letztendlich muss dp[x1][y1][x1-x0][y1-y0] ausgegeben werden. 

Guess you like

Origin blog.csdn.net/SYC20110120/article/details/134488985